--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dummy_foundation/generate_dummytree.pl Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,729 @@
+#! perl
+
+# Read a Foundation system model, mapping file, and System_Definition.xml
+# and generate a Perforce branchspec to reflect the code reorg
+
+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: generate_branchspec.pl <params> [options]
+
+params:
+-s <system_definition> XML version of Symbian System_definition
+-m <foundation_model> XML version of Foundation 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 $foundationmodel = "output_attr.xml";
+my $foundationdirs = "foundation_dirs.xml";
+my $systemdefinition = "variability/vp_data/templates/System_Definition_template.xml";
+my $rootdir = ".";
+my $remove = 0;
+my $cbrmappingfile = "";
+
+Usage("Bad arguments") unless GetOptions(
+ 'm=s' => \$foundationmodel,
+ 's=s' => \$systemdefinition,
+ 'o=s' => \$rootdir,
+ 'c=s' => \$cbrmappingfile);
+
+Usage("Too many arguments") if (scalar @ARGV > 0);
+Usage("Cannot find $foundationmodel") if (!-f $foundationmodel);
+
+
+my $xmlParser = new XML::DOM::Parser;
+XML::DOM::ignoreReadOnly(1);
+
+my $foundationpath = ".";
+my $sysdefpath = ".";
+$foundationpath = $1 if ($foundationmodel =~ /^(.+)\\[^\\]+$/);
+$sysdefpath = $1 if ($systemdefinition =~ /^(.+)\\[^\\]+$/);
+#$xmlParser->set_sgml_search_path($foundationpath, $sysdefpath);
+
+my $foundationXML = $xmlParser->parsefile ($foundationmodel);
+chdir($rootdir);
+
+# Collect the Schedule12 entries, checking for duplicates
+
+my %sch12refs;
+my %componenttype;
+my ($foundation) = $foundationXML->getElementsByTagName("SystemDefinition");
+Usage("No <SystemDefinition> in $foundationmodel ?") if (!defined $foundation);
+
+# Process the Foundation model to get the directory names
+
+my %unique_names;
+my %partnames;
+my %dirnames;
+my %component_dirs;
+my %old_component_mapping;
+my %component_object; # reference to XML <component> objects
+my %mrp_mapping;
+
+sub process_foundation($$); # declare the prototype for recursive call
+sub process_foundation($$)
+ {
+ my ($node,$level) = @_;
+
+ my @children = $node->getChildNodes;
+ foreach my $child (@children)
+ {
+ if ($child->getNodeTypeName ne "ELEMENT_NODE")
+ {
+ # text and comments don't count
+ next;
+ }
+ if ($level == 0)
+ {
+ process_foundation($child,1);
+ next;
+ }
+
+ next if ($child->getAttribute("contribution") eq "excluded");
+
+ my $tagname = $child->getTagName;
+ my $name = $child->getAttribute("name");
+ my $longname = $child->getAttribute("long-name");
+ $longname = $name if ($longname eq "");
+
+ if ($name ne "")
+ {
+ if (defined $unique_names{$name})
+ {
+ print "** duplicated name $name\n";
+ }
+ $unique_names{$name} = 1;
+ }
+ if ($name eq "")
+ {
+ printf "No name in %s\n", $child->toString();
+ next;
+ }
+
+ my $dirname = $name;
+ $dirname =~ s/\s+//g; # remove the spaces
+ $dirname =~ s/[\(\)]/_/g; # map troublesome characters
+ $dirname =~ s/[ \.]*$//g; # trailing spaces or dots
+ $partnames{$tagname} = $name;
+ $dirnames{$tagname} = $dirname;
+
+ print "making directory $dirname\n" if ($level <2);
+ mkdir $dirname; # create the directory
+
+ if ($tagname eq "component")
+ {
+ $child->printToFile("$dirname/component.txt");
+ next;
+ }
+
+ chdir $dirname;
+ if ($tagname eq "block")
+ {
+ # Create a fragment which describes this package
+ open PACKAGE_MODEL, ">package_model.xml";
+ print PACKAGE_MODEL "<!-- use XINCLUDE to put this fragment into a System_Model -->\n";
+ print PACKAGE_MODEL $child->toString();
+ print PACKAGE_MODEL "\n";
+ close PACKAGE_MODEL;
+ }
+
+ process_foundation($child,$level+1);
+ chdir "..";
+ }
+ }
+
+my ($model) = $foundationXML->getElementsByTagName("SystemDefinition");
+process_foundation($model,0);
+
+exit 0;
+
+# Dump the old component -> new component -> directory mapping
+
+foreach my $component (sort keys %old_component_mapping)
+ {
+ my $new_component = $old_component_mapping{$component};
+ printf "%s => %s => %s\n",
+ $component, $new_component, $component_dirs{$new_component};
+ }
+
+# Find the old component entries in the XML file
+
+my %branchspec;
+my %reverse_branchspec;
+my %primary_mrp;
+my %otherroots;
+my %ignoreme;
+
+sub add_to_branchspec($$;$$);
+sub add_to_branchspec($$;$$)
+ {
+ my ($olddir,$newdir,$primary,$noexpansion) = @_;
+ $primary = "generate_branchspec.pl" if (!defined $primary);
+
+ if (defined $ignoreme{$olddir} && $primary !~ /^extra root/)
+ {
+ print "Ignoring $olddir - $ignoreme{$olddir}\n";
+ next;
+ }
+ if (defined $branchspec{$olddir})
+ {
+ if ($newdir eq $branchspec{$olddir})
+ {
+ # reasserting the previous branchspec - not a problem
+ return;
+ }
+ # trying to change the old mapping
+ print "$primary attempted to redefine $olddir mapping\n";
+ print "Was $branchspec{$olddir} instead of $newdir\n";
+ exit(1);
+ }
+
+ if (defined $reverse_branchspec{$newdir})
+ {
+ print "Branchspec collision from $primary into $newdir\n";
+ print "Can't send $olddir and $reverse_branchspec{$newdir} to same place\n";
+ exit(1);
+ }
+
+ if (defined $otherroots{$olddir} && !$noexpansion)
+ {
+ print "Adjusting branchspec for $primary to include the other roots\n";
+ my $otherolddir = $olddir;
+ $otherolddir =~ s/([^\/]+)\/$//;
+ my $maindir = $1;
+ add_to_branchspec("$olddir","$newdir$maindir/",$primary,1); # avoid recursion
+
+ foreach my $otherdir (split /\//, $otherroots{$olddir})
+ {
+ next if (length($otherdir) == 0);
+ add_to_branchspec("$otherolddir$otherdir/","$newdir$otherdir/","extra root of $primary",1);
+ }
+ }
+ else
+ {
+ $branchspec{$olddir} = $newdir;
+ $reverse_branchspec{$newdir} = $olddir;
+ $primary_mrp{$olddir} = $primary;
+ }
+ }
+
+# Workaround for the common/product and cedar/product directories, which don't
+# have associated CBR components
+
+add_to_branchspec("common/product/", "ostools/toolsandutils/ToolsandUtils/product/");
+add_to_branchspec("cedar/product/", "ostools/toolsandutils/ToolsandUtils/cedarproduct/");
+
+# Add catchall mappings to get all do the other odds and ends
+# LHS must be more specific than a single directory, otherwise apply_branchspec hits too many things
+# RHS must be short, to avoid blowing the Windows path limit when syncing TBAS builds
+add_to_branchspec("common/generic/", "os/unref/orphan/comgen/", "(Orphans)");
+add_to_branchspec("common/techview/", "os/unref/orphan/comtv/", "(Orphans)");
+add_to_branchspec("common/testtools/", "os/unref/orphan/comtt/", "(Orphans)");
+add_to_branchspec("common/connectqi/", "os/unref/orphan/comqi/", "(Orphans)");
+add_to_branchspec("cedar/generic/", "os/unref/orphan/cedgen/", "(Orphans)");
+
+my @clumps = (
+ "cedar/generic/base/e32/",
+ "cedar/generic/base/f32/",
+ "common/generic/comms-infras/esock/",
+ "common/generic/multimedia/ecam/",
+ "common/generic/multimedia/icl/",
+ "common/generic/multimedia/mmf/",
+ "common/generic/j2me/", # not really a clump, but must be called "j2me"
+ "common/generic/telephony/trp/",
+ "common/generic/security/caf2/test/",
+ "common/generic/networking/dialog/",
+ "common/generic/comms-infras/commsdat/",
+ "common/generic/connectivity/legacy/PLP/", # plpvariant shares PLPInc main PLP group
+ "common/testtools/ResourceHandler/", # entangled versions for Techview, UIQ and S60
+);
+
+# Force E32 into a faintly sensible place
+
+add_to_branchspec("cedar/generic/base/e32/", "os/kernelhwsrv/kernel/eka/", "(Hand coded E32 location)");
+
+# Force j2me to be called j2me
+
+add_to_branchspec("common/generic/j2me/", "app/java/midpprofile/midpmidlet/j2me/", "(Hand coded J2ME location)");
+
+# Peer relationships if x uses "..\y", then add this as $peers{"x"} = "y"
+
+my %peers;
+$peers{"cedar/generic/tools/e32toolp/"} = "cedar/generic/tools/buildsystem/";
+
+# multirooted components, which own several trees that have no common root
+# Add these to the branchspec automatically alongside the root containing the MRP file
+
+$otherroots{"common/generic/networking/inhook6/"} = "inhook6example";
+$otherroots{"common/generic/networking/examplecode/"} = "anvltest/cgi/ping/udpecho/udpsend/webserver";
+$otherroots{"common/generic/networking/qos/"} = "qostest/QoSTesting";
+$otherroots{"common/generic/wap-stack/wapstack/"} = "documentation/confidential";
+$otherroots{"common/generic/bluetooth/latest/bluetooth/test/"} = "example/testui";
+
+
+my %hasbldfile;
+
+my %foundationrefs;
+my %foundationbymrp;
+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 "layer")
+ {
+ $partnames{"block"} = undef;
+ $partnames{"subblock"} = undef;
+ $partnames{"collection"} = undef;
+ }
+ if ($tagname eq "block")
+ {
+ $partnames{"subblock"} = undef;
+ $partnames{"collection"} = undef;
+ }
+ if ($tagname eq "subblock")
+ {
+ $partnames{"collection"} = undef;
+ }
+ if ($tagname eq "unit")
+ {
+ # units are the payload
+
+ my $mrp = $child->getAttribute("mrp");
+ $mrp =~ s/\\/\//g; # ensure that / separators are used
+ $child->setAttribute("mrp",$mrp);
+
+ my $blockname = $partnames{"subblock"};
+ $blockname = $partnames{"block"} if (!defined $blockname); # no subblock
+ $blockname = "Misc" if (!defined $blockname); # no block either
+ my $old_component = join("::",
+ $partnames{"layer"}, $blockname,
+ $partnames{"collection"},$partnames{"component"});
+
+ # find corresponding new component
+
+ my $new_component;
+
+ if (defined $mrp_mapping{$mrp})
+ {
+ $new_component = $mrp_mapping{$mrp};
+ my $othermapping = $old_component_mapping{$old_component};
+ if (defined $othermapping && $othermapping eq $new_component)
+ {
+ # they agree - lovely.
+ }
+ else
+ {
+ print "MRP mapping $mrp -> $new_component, disagrees with $old_component mapping\n";
+ }
+ delete $component_object{$new_component};
+ }
+ if (!defined $new_component)
+ {
+ $new_component = $old_component_mapping{$old_component};
+ }
+ if (!defined $new_component)
+ {
+ # Some "old_package" information is incorrect - scan for a close match
+ # Strategy 1 - match collection::component
+ my $tail = join ("::", $partnames{"collection"},$partnames{"component"});
+ my $len = 0-length($tail);
+
+ foreach my $guess (keys %old_component_mapping)
+ {
+ if (substr($guess,$len) eq $tail)
+ {
+ print "Guessed that $old_component should be $guess\n";
+ $new_component = $old_component_mapping{$guess};
+ last;
+ }
+ }
+ }
+ if (!defined $new_component)
+ {
+ # Some "old_package" information is incorrect - scan for a close match
+ # Strategy 2 - just match the component name,
+ # truncate after last / e.g. GPRS/UMTS QoS Framework => UMTS QoS Framework
+ my $tail = "::".$partnames{"component"};
+ $tail =~ s/^.*\/([^\/]*)$/$1/;
+ my $len = 0-length($tail);
+
+ foreach my $guess (keys %old_component_mapping)
+ {
+ if (substr($guess,$len) eq $tail)
+ {
+ print "Guessed that $old_component should be $guess\n";
+ $new_component = $old_component_mapping{$guess};
+ last;
+ }
+ }
+ }
+ if (!defined $new_component)
+ {
+ print "Rescuing unreferenced $old_component\n";
+ # later we will infer the new_component directory from the mrp
+ }
+ else
+ {
+ if (!defined $mrp_mapping{$mrp})
+ {
+ # Copy the unit into the Foundation model (we'll fix it later)
+
+ my $foundation_comp = $component_object{$new_component};
+ $node->removeChild($child);
+ $child->setOwnerDocument($foundation_comp->getOwnerDocument);
+ $foundation_comp->addText("\n ");
+ $foundation_comp->appendChild($child);
+ $foundation_comp->addText("\n ");
+ delete $component_object{$new_component}; # remove items after processing
+ }
+ }
+
+ # determine the root of the component source tree from the mrp attribute
+
+ if ($mrp =~ /^\//)
+ {
+ print "Skipping absolute MRP $mrp in $old_component\n";
+ next;
+ }
+
+ my $current_dir = $mrp;
+ $current_dir =~ s-/[^/]+$-/-; # remove filename;
+
+ # tree structure special cases
+ $current_dir =~ s-/sms/multimode/Group/-/sms/-;
+ $current_dir =~ s-/agendaserver/TestAgendaSrv/-/agendaserver/-;
+ $current_dir =~ s-/alarmserver/TestAlarmSrv/-/alarmserver/-;
+ $current_dir =~ s-/trace/ulogger/group/-/trace/-;
+ $current_dir =~ s-/ucc/BuildScripts/group/-/ucc/-;
+ $current_dir =~ s-/worldserver/TestWorldSrv/-/worldserver/-;
+ $current_dir =~ s-/adapters/devman/Group/-/adapters/-; # avoid collision with syncml/devman
+ $current_dir =~ s-/mobiletv/hai/dvbh/group/-/mobiletv/-;
+ $current_dir =~ s-/plpgrp/-/-i; # connectivity/legacy/PLP/plpgrp
+ $current_dir =~ s-/(h2|h4)/.*$-/-i; # various baseports
+
+ # more generic cases
+ $current_dir =~ s-/group/.*$-/-i; # group (& subdirs)
+ $current_dir =~ s-/group[^/]+/.*$-/-i; # groupsql, groupfuture (& subdirs) - cntmodel, s60 header compat
+ $current_dir =~ s-/mmpfiles/-/-i; # comp/mmpfiles
+
+ # apply clumping rules
+
+ foreach my $clump (@clumps)
+ {
+ if (substr($current_dir,0,length($clump)) eq $clump)
+ {
+ print "$mrp is part of the component group rooted at $clump\n";
+ $current_dir = $clump;
+ last;
+ }
+ }
+
+ # check for inseparable components
+ my $new_dir;
+ my $primary;
+ my $set_peer_directory = 0;
+
+ if (defined $branchspec{$current_dir})
+ {
+ $primary = $primary_mrp{$current_dir};
+ print "Cannot separate $mrp from $primary\n";
+ $new_dir = $branchspec{$current_dir}; # use the directory for the other component
+ }
+ elsif (defined $peers{$current_dir})
+ {
+ # apply peering rules
+ my $peer = $peers{$current_dir};
+
+ if (defined $branchspec{$peer})
+ {
+ # peer already defined - adjust our mapping
+ $new_dir = $branchspec{$peer};
+ $new_dir =~ s/[^\/]+\/$//;
+ $current_dir =~ m/([^\/]+\/)$/;
+ $new_dir .= $1;
+ print "Mapping $mrp to $new_dir to be next to peer $peer\n";
+ $primary = $mrp;
+ }
+ else
+ {
+ # we are the first to appear, so we determine the directory
+ $set_peer_directory = 1;
+ }
+ }
+
+ if (!defined $new_dir)
+ {
+ if (defined $new_component)
+ {
+ $new_dir = $component_dirs{$new_component};
+ }
+ else
+ {
+ $new_dir = "os/unref/$current_dir";
+ $new_dir =~ s/common\/generic/comgen/;
+ $new_dir =~ s/common\/techview/comtv/;
+ $new_dir =~ s/common\/testtools/comtt/;
+ $new_dir =~ s/common\/connectqi/comqi/;
+ $new_dir =~ s/common\/developerlibrary/devlib/;
+ $new_dir =~ s/cedar\/generic/cedgen/;
+ }
+ $primary = $mrp;
+ }
+
+ # Update the mrp attribute
+
+ substr($mrp,0,length($current_dir)) = $new_dir;
+ # $child->setAttribute("mrp",$mrp);
+
+ # update the bldFile attribute, if any
+ my $bldFile = $child->getAttribute("bldFile");
+ if ($bldFile)
+ {
+ $bldFile =~ s/\\/\//g; # ensure that / separators are used
+ $child->setAttribute("bldFile",$bldFile);
+ $hasbldfile{$current_dir} = 1;
+ my $saved_bldFile = $bldFile;
+ $bldFile .= "/" if ($bldFile !~ /\/$/); # add trailing /
+ my $previous = substr($bldFile,0,length($current_dir),$new_dir);
+ if ($previous ne $current_dir)
+ {
+ print "*** $old_component bldFile=$saved_bldFile not in $current_dir\n";
+ }
+ else
+ {
+ $bldFile =~ s/\/+$//; # remove trailing /
+ # $child->setAttribute("bldFile",$bldFile);
+ }
+ }
+
+ add_to_branchspec($current_dir, $new_dir, $primary);
+
+ if ($set_peer_directory)
+ {
+ # peer mapping implied by our mapping
+ my $peer = $peers{$current_dir};
+ $new_dir =~ s/[^\/]+\/$//;
+ $peer =~ m/([^\/]+\/)$/;
+ $new_dir .= $1;
+ print "Implied mapping $peer to $new_dir to be next to $mrp\n";
+ add_to_branchspec($peer, $new_dir, "$mrp (peer)");
+ }
+
+ next;
+ }
+ my $name = $child->getAttribute("name");
+ $partnames{$tagname} = $name;
+ match_names($child);
+ }
+ }
+
+foreach my $missing (sort keys %component_object)
+ {
+ print "No mapping found for Symbian-derived component $missing\n";
+ }
+
+# Output Perforce branchspec, taking care to "subtract" the
+# places where a subtree is branched to a different place
+
+my $from = "//epoc/release/9.4";
+my $to = "//epoc/development/personal/williamro/seaside/31";
+my %processed;
+
+printf "\n\n========== branchspec with %d elements\n", scalar keys %branchspec;
+
+foreach my $olddir (sort keys %branchspec)
+ {
+ my $comment = $hasbldfile{$olddir} ? "" : "\t# src";
+
+ my $subtraction = "";
+ my @parts = split /\//, $olddir;
+ my $root = "";
+ while (@parts)
+ {
+ my $part = shift @parts;
+ $root .= "$part/";
+ if (defined $processed{$root})
+ {
+ # Found a containing tree
+ my $remainder = join("/",@parts);
+ $subtraction = sprintf "\t-$from/%s%s/... $to/%s%s/...\n",
+ $root, $remainder, $branchspec{$root}, $remainder;
+ # continue in case there is a containing sub-subtree.
+ }
+ }
+ print $subtraction; # usually empty
+ printf "\t$from/%s... $to/%s...%s\n", $olddir, $branchspec{$olddir},$comment;
+ $processed{$olddir} = 1;
+ }
+
+exit(0);
+
+# 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 $foundationrefs{$name})\n";
+ print STDERR "No match for $name (associated with $foundationrefs{$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,$foundationname) = @_;
+ 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);
+ $foundationbymrp{$mrp} = $foundationname;
+ $locationbymrp{$mrp} = "$location\t$nodename";
+ next;
+ }
+ my $submatch = $child->getAttribute("MATCHED");
+ if ($submatch)
+ {
+ list_mrps($child,$sublocation,$submatch);
+ }
+ else
+ {
+ list_mrps($child,$sublocation,$foundationname);
+ }
+ }
+ }
+
+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 $foundationname = $child->getAttribute("MATCHED");
+ if ($foundationname)
+ {
+ list_mrps($child, $sublocation, $foundationname);
+ $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 ($cbrmappingfile ne "")
+ {
+ $componenttype{"*UNREFERENCED*"} = "??";
+ open CBRMAP, ">$cbrmappingfile" or die("Unable to write to $cbrmappingfile: $!\n");
+ foreach my $mrp (sort keys %sch12bymrp)
+ {
+ my $component = $foundationbymrp{$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/dummy_foundation/lib/Date/Manip.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Date/Manip.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Parse/Yapp.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Parse/Yapp/Driver.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Parse/Yapp/Grammar.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Parse/Yapp/Lalr.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Parse/Yapp/Options.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Parse/Yapp/Output.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/Parse/Yapp/Parse.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Checker.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Checker/DOM.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Checker/Parser.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/AttDef.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/AttlistDecl.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Attr.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/CDATASection.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/CharacterData.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Comment.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/DOMException.pm Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,88 @@
+######################################################################
+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/dummy_foundation/lib/XML/DOM/DOMImplementation.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Document.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/DocumentFragment.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/DocumentType.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Element.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/ElementDecl.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Entity.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/EntityReference.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/NamedNodeMap.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/NamedNodeMap.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Node.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/NodeList.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/NodeList.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Notation.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Parser.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/PerlSAX.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/ProcessingInstruction.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/Text.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/ValParser.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/DOM/XMLDecl.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Filter/DetectWS.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Filter/Reindent.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Filter/SAXT.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Handler/BuildDOM.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Handler/CanonXMLWriter.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Handler/Composer.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Handler/PrintEvents.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Handler/Sample.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Handler/Subs.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Handler/XMLWriter.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Parser.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/Parser/Expat.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/RegExp.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/UM.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/DOM.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/Date.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/Debug.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/DirXQL.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/Parser.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/Plus.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/Query.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/Strict.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/XQL/Tutorial.pod Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/XML/perllocal.pod Thu May 28 10:10:03 2009 +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\common\generic\tools\build\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/dummy_foundation/lib/freezethaw/FreezeThaw.pm Thu May 28 10:10:03 2009 +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/dummy_foundation/lib/gpl.licence.txt Thu May 28 10:10:03 2009 +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 dummy_foundation/lib/src/DateManip-5.42a.tar.gz has changed
Binary file dummy_foundation/lib/src/FreezeThaw-0.43.tar.gz has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dummy_foundation/new_output_attr.xml Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,5708 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<SystemDefinition xmlns:s="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" name="Foundation" schema="2.0.0">
+ <systemModel>
+ <layer name="os" long-name="OS" levels="hw services" contribution="contributed">
+ <block name="kernelhwsrv" levels="hw-if adaptation framework test" contribution="contributed" long-name="Kernel and Hardware Services" tech_domain="hb" level="hw">
+ <collection name="Base API Tests" level="test" contribution="contributed">
+ <component name="Base SVS" impl_language="os" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" mrp="tools/test/suites/technology/base/group/testproduct_base.mrp"/>
+ </component>
+ </collection>
+ <collection name="baseusersidetests" original-name="Base User-side Tests" long-name="Base User-side Tests" id="Base User-side Tests" level="test" contribution="contributed">
+ <component name="baseintegrationtest" original-name="Base Integration Test" long-name="Base Integration Test" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Base User-side Tests" comment="" introduced="9.3" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="372405">
+ <unit bldFile="os/kernelhwsrv/baseusersidetests/baseintegrationtest/group" mrp="os/kernelhwsrv/baseusersidetests/baseintegrationtest/group/base_integration_test.mrp"/>
+ </component>
+ </collection>
+ <collection name="bootloader" original-name="Boot Loader" long-name="Boot Loader" id="Boot Loader" level="hw-if" contribution="contributed">
+ <component name="ubootldr" original-name="Bootstrap" long-name="Bootstrap" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Boot Loader" comment="" introduced="9.2" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="Mark Adler" license_status="" ship_license="No" source="yes" partial_contribution="yes" license="zlib libpng open Source License" in_production_device_rom="no" platform_critical="no" source_size="46921">
+ <unit mrp="os/kernelhwsrv/bootloader/ubootldr/base_ubootldr.mrp"/>
+ </component>
+ </collection>
+ <collection name="unistore2" original-name="Flash Translation Layer" long-name="Unistore2 Flash Translation Layer" id="Flash Translation Layer" level="hw-if" contribution="contributed">
+ <component name="uiidrivers" original-name="Unistore2 Drivers" long-name="Unistore2 Drivers" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Flash Translation Layer" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics; Samsung" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung Electronics; Samsung" in_production_device_rom="yes" platform_critical="no" source_size="219980">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/unistore2" mrp="os/kernelhwsrv/kernel/eka/drivers/unistore2/base_drivers_unistore2.mrp"/>
+ </component>
+ <component name="uiicore" original-name="Unistore2 Core" long-name="Unistore2 Core" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Flash Translation Layer" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics; Samsung" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung Electronics; Samsung" in_production_device_rom="yes" platform_critical="no" source_size="348561">
+ <unit mrp="os/kernelhwsrv/kernel/eka/drivers/unistore2/base_drivers_unistore2_undeliverable.mrp"/>
+ </component>
+ <component name="uiicrashlogger" original-name="Unistore2 Crash Logger" long-name="Unistore2 Crash Logger" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Flash Translation Layer" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung" in_production_device_rom="yes" platform_critical="no" source_size="6691">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/crashflash/unistore2" mrp="os/kernelhwsrv/kernel/eka/drivers/crashflash/unistore2/base_crashflash_unistore2.mrp"/>
+ </component>
+ <component name="uiibootsupport" original-name="Unistore2 Boot Support" long-name="Unistore2 Boot Support" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Flash Translation Layer" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung" in_production_device_rom="yes" platform_critical="no" source_size="7380">
+ <unit mrp="os/kernelhwsrv/flashtranslationlayer/unistore2bootsupport/base_nandboot_unistore2.mrp" version="9.4" bldFile="os/kernelhwsrv/flashtranslationlayer/unistore2bootsupport/nandloader/unistore2"/>
+ <unit mrp="os/kernelhwsrv/flashtranslationlayer/unistore2bootsupport/nandloader/unistore2/base_nandboot_unistore2.mrp" version="9.5" bldFile="os/kernelhwsrv/flashtranslationlayer/unistore2bootsupport/nandloader/unistore2"/>
+ <unit bldFile="os/kernelhwsrv/flashtranslationlayer/unistore2bootsupport/nandloader/unistore2" mrp="os/kernelhwsrv/flashtranslationlayer/unistore2bootsupport/base_nandboot_unistore2.mrp"/>
+ </component>
+ </collection>
+ <collection name="bsptemplate" original-name="Generic BSP" long-name="BSP Template" id="Generic BSP" level="hw-if" contribution="contributed">
+ <component name="templateasspandvariant" original-name="Template Variant" long-name="Template ASSP and Variant" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Generic BSP" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="152744">
+ <unit mrp="os/unref/cedgen/base/template/base_template.mrp" version="9.4" bldFile="os/unref/cedgen/base/template/template_variant"/>
+ <unit mrp="os/unref/cedgen/base/template/template_variant/base_template.mrp" version="9.5" bldFile="os/unref/cedgen/base/template/template_variant"/>
+ </component>
+ </collection>
+ <collection name="kernel" original-name="Kernel Architecture" long-name="Kernel Architecture" id="Kernel Architecture" level="adaptation" contribution="contributed">
+ <component name="eka" original-name="Kernel Architecture 2" long-name="Kernel Architecture" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Kernel Architecture" comment="" introduced="8.0" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Various Commercial" license_status="No" ship_license="No" source="no" partial_contribution="yes" license="ARM; OSS (unknown)" in_production_device_rom="yes" platform_critical="yes" source_size="3266991">
+ <unit bldFile="os/kernelhwsrv/kernel/eka" mrp="os/kernelhwsrv/kernel/eka/base_e32.mrp"/>
+ </component>
+ </collection>
+ <collection name="kerneltest" original-name="Kernel Test" long-name="Kernel Test" id="Kernel Test" level="hw-if" contribution="contributed">
+ <component name="e32test" original-name="E32 Tests" long-name="E32 Tests" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Kernel Test" comment="" class="test" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="GPL" license_status="No" ship_license="No" source="yes" partial_contribution="" license="GPL" in_production_device_rom="no" platform_critical="no" source_size="7946113">
+ <unit bldFile="os/kernelhwsrv/kerneltest/e32test/group" mrp="os/kernelhwsrv/kerneltest/e32test/group/base_e32test.mrp"/>
+ </component>
+ <component name="sdiotest" original-name="SDIO Tests" long-name="SDIO Tests" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Kernel Test" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="64970">
+ <unit bldFile="os/kernelhwsrv/kerneltest/sdiotests" mrp="os/kernelhwsrv/kerneltest/sdiotests/base_sdiotests.mrp"/>
+ </component>
+ <component name="e32utils" original-name="E32 Utilities" long-name="E32 Utilities" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Kernel Test" comment="" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Various Commercial" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Samsung Electronics; Microsoft (unknown - forensic)" in_production_device_rom="no" platform_critical="no" source_size="483969">
+ <unit bldFile="os/kernelhwsrv/kerneltest/e32utils/group" mrp="os/kernelhwsrv/kerneltest/e32utils/group/base_e32utils.mrp"/>
+ </component>
+ <component name="f32test" original-name="File Server Tests" long-name="File Server Tests" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Kernel Test" comment="" class="test" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="ENEA Data AB" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="ENEA Data AB" in_production_device_rom="no" platform_critical="no" source_size="2981798">
+ <unit bldFile="os/kernelhwsrv/kerneltest/fileservertests/group" mrp="os/kernelhwsrv/kerneltest/fileservertests/group/base_f32test.mrp"/>
+ </component>
+ </collection>
+ <collection name="ldds" original-name="Logical Device Drivers" long-name="Logical Device Drivers" id="Logical Device Drivers" level="adaptation" contribution="contributed">
+ <component name="ethernetdrivers" original-name="Ethernet Driver" long-name="Ethernet Drivers" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="6672">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/ethernet" mrp="os/kernelhwsrv/kernel/eka/drivers/ethernet/base_e32_drivers_ethernet.mrp"/>
+ </component>
+ <component name="audiodrivers" original-name="Sound Driver" long-name="Audio Drivers" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="29532">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/esound" mrp="os/kernelhwsrv/kernel/eka/drivers/esound/base_e32_drivers_sound.mrp"/>
+ </component>
+ <component name="serialportdrivers" original-name="Serial Port Driver" long-name="Serial Port Drivers" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="17402">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/ecomm" mrp="os/kernelhwsrv/kernel/eka/drivers/ecomm/base_e32_drivers_ecomm.mrp"/>
+ </component>
+ <component name="legacydrivers" original-name="Legacy Drivers" long-name="Legacy Drivers" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2061">
+ <unit mrp="os/kernelhwsrv/kernel/eka/drivers/adc/base_e32_drivers_adc.mrp"/>
+ </component>
+ <component name="locmedia" original-name="Local Media Subsystem" long-name="Local Media Subsystem" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="38917">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/locmedia" mrp="os/kernelhwsrv/kernel/eka/drivers/locmedia/base_e32_drivers_locmedia.mrp"/>
+ </component>
+ <component name="runmodedebugger" original-name="Run Mode Debugger" long-name="Run Mode Debugger" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="110928">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/debug" mrp="os/kernelhwsrv/kernel/eka/drivers/debug/base_e32_drivers_debug.mrp"/>
+ </component>
+ <component name="btrace" original-name="Kernel Trace Tool" long-name="Kernel Trace Tool" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="15774">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/trace" mrp="os/kernelhwsrv/kernel/eka/drivers/trace/base_e32_drivers_trace.mrp"/>
+ </component>
+ <component name="cameradrivers" original-name="Camera Driver" long-name="Camera Drivers" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Logical Device Drivers" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/camerasc" mrp="os/kernelhwsrv/kernel/eka/drivers/camerasc/base_drivers_camerasc.mrp"/>
+ </component>
+ </collection>
+ <collection name="driversupport" original-name="Generic Driver Support" long-name="Generic Driver Support" id="Generic Driver Support" level="hw-if" contribution="contributed">
+ <component name="sdcard3c" original-name="SD Card 3C Driver" long-name="SD Card 3C Driver" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Generic Driver Support" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="3C LLC" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="3C LLC" in_production_device_rom="yes" platform_critical="no" source_size="144077">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/pbus/mmc/sdcard/sdcard3c" mrp="os/kernelhwsrv/kernel/eka/drivers/pbus/mmc/sdcard/sdcard3c/base_e32_sd3c.mrp"/>
+ </component>
+ <component name="sdcard4c" original-name="SD Card 4C Driver" long-name="SD Card 4C Driver" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Generic Driver Support" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="4C LLC" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="4C LLC" in_production_device_rom="yes" platform_critical="no" source_size="54730">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/pbus/mmc/sdcard/sdcard4c" mrp="os/kernelhwsrv/kernel/eka/drivers/pbus/mmc/sdcard/sdcard4c/base_e32_sd4c.mrp"/>
+ </component>
+ <component name="mediadrivers" original-name="Media Drivers" long-name="Media Drivers" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Generic Driver Support" comment="" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="Samsung Electronics" in_production_device_rom="yes" platform_critical="no" source_size="234382">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/media" mrp="os/kernelhwsrv/kernel/eka/drivers/media/base_e32_drivers_media.mrp"/>
+ </component>
+ <component name="genericboardsupport" original-name="Generic Board Support Packages" long-name="Generic Board Support" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Generic Driver Support" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="76381">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/bsp" mrp="os/kernelhwsrv/kernel/eka/drivers/bsp/base_e32_drivers_bsp.mrp"/>
+ </component>
+ <component name="systemonchipassp" original-name="System On Chip ASSP" long-name="System On Chip ASSP" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Generic Driver Support" comment="" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Panasonic" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Panasonic" in_production_device_rom="no" platform_critical="no" source_size="92015">
+ <unit mrp="os/kernelhwsrv/genericdriversupport/systemonchipassp/base_soc.mrp"/>
+ </component>
+ </collection>
+ <collection name="localisation" original-name="Localisation" long-name="Localisation" id="Localisation" level="adaptation" contribution="contributed">
+ <component name="localesupport" original-name="Locale Support" long-name="Locale Support" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Localisation" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1116262">
+ <unit bldFile="os/kernelhwsrv/localisation/localesupport" mrp="os/kernelhwsrv/localisation/localesupport/mmpfiles/base_loce32.mrp"/>
+ </component>
+ </collection>
+ <collection name="userlibandfileserver" original-name="User Library and File Server" long-name="User Library and File Server" id="User Library and File Server" level="framework" contribution="contributed">
+ <component name="euser" original-name="User Library" long-name="User Library" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="799620">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/euser" mrp="os/kernelhwsrv/kernel/eka/euser/base_e32_euser.mrp"/>
+ </component>
+ <component name="compsupp" original-name="Compiler Runtime Support" long-name="Compiler Runtime Support" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="ARM" license_status="No" ship_license="No" source="no" partial_contribution="yes" license="ARM" in_production_device_rom="yes" platform_critical="yes" source_size="671087">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/compsupp" mrp="os/kernelhwsrv/kernel/eka/compsupp/base_e32_compsupp.mrp"/>
+ </component>
+ <component name="fileserver" original-name="File Server" long-name="File Server" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="Samsung Electronics" in_production_device_rom="yes" platform_critical="yes" source_size="636985">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/group" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/group/base_f32.mrp"/>
+ </component>
+ <component name="fatfilenameconversionplugins" original-name="FAT Filename Conversion Plugins" long-name="FAT Filename Conversion Plugins" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" plugin="Y" introduced="9.1" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="526747">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fatfilenameconversionplugins/group" mrp="os/kernelhwsrv/userlibandfileserver/fatfilenameconversionplugins/group/syslibs_FATCharsetConv.mrp"/>
+ </component>
+ <component name="nandftl" original-name="NAND Flash Translation Layer" long-name="SSR Flash Translation Layer" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" introduced="7.0s" deprecated="9.1" contribution="partial" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="Samsung Electronics" in_production_device_rom="yes" platform_critical="yes" source_size="44247">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/sftl" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/sftl/base_f32_sftl.mrp"/>
+ </component>
+ <component name="estart" original-name="Base Starter" long-name="Base Starter" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="24096">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/estart" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/estart/base_f32_estart.mrp"/>
+ </component>
+ <component name="domainmgr" original-name="Domain Manager" long-name="Domain Manager" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="30770">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/domainmgr/group" mrp="os/kernelhwsrv/userlibandfileserver/domainmgr/group/base_domain.mrp"/>
+ </component>
+ <component name="basedocs" original-name="Base Documentation" long-name="Base Documentation" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="User Library and File Server" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="10752494">
+ <unit mrp="os/kernelhwsrv/userlibandfileserver/basedocs/base_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="filesystems" original-name="File Systems" long-name="File Systems" id="File Systems" level="framework" contribution="contributed">
+ <component name="romfs" original-name="ROM File System" long-name="ROM File System" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="7261">
+ <unit mrp="os/kernelhwsrv/userlibandfileserver/fileserver/srom/base_f32_srom.mrp"/>
+ </component>
+ <component name="rofs" original-name="ROFS" long-name="ROFS" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="16772">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/srofs" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/srofs/base_f32_srofs.mrp"/>
+ </component>
+ <component name="usbmsfs" original-name="USB Mass Storage File System" long-name="USB Mass Storage File System" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="70930">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/smassstorage" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/smassstorage/base_f32_smassstorage.mrp"/>
+ </component>
+ <component name="usbhostmassstorageserver" original-name="USB Host Mass Storage Server" long-name="USB Host Mass Storage Server" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="90269">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/shostmassstorage" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/shostmassstorage/base_f32_shostmassstorage.mrp"/>
+ </component>
+ <component name="lffs" original-name="LFFS" long-name="LFFS" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="ENEA Data AB; Enea Data" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="ENEA Data AB; Enea Data" in_production_device_rom="yes" platform_critical="yes" source_size="249523">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/slffs" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/slffs/base_f32_slffs.mrp"/>
+ </component>
+ <component name="fat32fs" original-name="FAT32 File System" long-name="FAT32 File System" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Microsoft" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Microsoft" in_production_device_rom="yes" platform_critical="yes" source_size="97391">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/sfat32" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/sfat32/base_f32_sfat32.mrp"/>
+ </component>
+ <component name="fatfs" original-name="FAT File System" long-name="FAT File System" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="164362">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/sfat" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/sfat/base_f32_sfat.mrp"/>
+ </component>
+ <component name="compfs" original-name="Composite File System" long-name="Composite File System" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="9698">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/scomp" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/scomp/base_f32_scomp.mrp"/>
+ </component>
+ <component name="ntfs" original-name="NTFS" long-name="NTFS" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="20086">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/ntfs" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/ntfs/base_f32_sntfs.mrp"/>
+ </component>
+ <component name="iso9660fs" original-name="ISO9660 File System" long-name="ISO9660 File System" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="File Systems" comment="" plugin="Y" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="8270">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/iso9660" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/iso9660/base_f32_siso9660.mrp"/>
+ </component>
+ </collection>
+ <collection name="halservices" original-name="HAL Services" long-name="HAL Services" id="HAL Services" level="framework" contribution="contributed">
+ <component name="hal" original-name="User-Side Hardware Abstraction" long-name="User-Side Hardware Abstraction" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="HAL Services" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="37498">
+ <unit bldFile="os/kernelhwsrv/halservices/hal" mrp="os/kernelhwsrv/halservices/hal/base_hal.mrp"/>
+ </component>
+ </collection>
+ <collection name="textmodeshell" original-name="Text Mode Shell" long-name="Text Mode Shell" id="Text Mode Shell" level="test" contribution="contributed">
+ <component name="e32wsrv" original-name="Text Window Server" long-name="Text Window Server" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Text Mode Shell" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="60099">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/ewsrv" mrp="os/kernelhwsrv/kernel/eka/ewsrv/base_e32_ewsrv.mrp"/>
+ </component>
+ <component name="textshell" original-name="Text Shell" long-name="Text Shell" old_model="MCL" old_layer="Kernel Services" old_package="Kernel and Hardware Services" old_collection="Text Mode Shell" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="47185">
+ <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/etshell" mrp="os/kernelhwsrv/userlibandfileserver/fileserver/etshell/base_f32_eshell.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block name="boardsupport" levels="bsp test 2 3 4" contribution="contributed" long-name="Board Support" tech_domain="hb" level="hw">
+ <collection name="HAI Test Suites" level="test" contribution="contributed">
+ <component name="BSP SVS" impl_language="os" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" mrp="tools/test/suites/salt/base/group/testproduct_base_bsp.mrp"/>
+ </component>
+ </collection>
+ <collection name="emulator" original-name="Emulator" long-name="Emulator" id="Emulator" level="bsp" contribution="contributed">
+ <component name="emulatorbsp" original-name="Emulator BSP" long-name="Emulator BSP" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Emulator" comment="" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Various Commercial and OSS" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="Various Commercial and OSS" in_production_device_rom="yes" platform_critical="no" source_size="1117767">
+ <unit bldFile="os/boardsupport/emulator/emulatorbsp" mrp="os/boardsupport/emulator/emulatorbsp/base_wins.mrp"/>
+ </component>
+ <component name="unistore2emulatorsupport" original-name="Unistore2 Emulator Support" long-name="Unistore2 Emulator Support" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Emulator" comment="" introduced="9.4" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics; Samsung" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung Electronics; Samsung" in_production_device_rom="yes" platform_critical="no" source_size="81297">
+ <unit bldFile="os/boardsupport/emulator/unistore2emulatorsupport" mrp="os/boardsupport/emulator/unistore2emulatorsupport/base_wins_unistore2.mrp"/>
+ </component>
+ </collection>
+ <collection name="assabet" original-name="Assabet" long-name="Assabet" id="Assabet" level="bsp" contribution="contributed">
+ <component name="assabetbsp" original-name="Assabet BSP" long-name="Assabet BSP" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Assabet" comment="" introduced="7.0" deprecated="8.0" removed="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="138063">
+ <unit bldFile="os/boardsupport/assabet/assabetbsp" mrp="os/boardsupport/assabet/assabetbsp/base_assabet.mrp"/>
+ </component>
+ <component name="strongarm1100assp" original-name="StrongArm 1100 ASSP" long-name="StrongArm 1100 ASSP" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Assabet" comment="" introduced="8.1" removed="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="47727">
+ <unit mrp="os/boardsupport/assabet/strongarm1100assp/base_sa1100.mrp"/>
+ </component>
+ </collection>
+ <collection name="integratorbsp" original-name="Integrator BSP" long-name="Integrator BSP" id="Integrator BSP" level="bsp" contribution="contributed">
+ <component name="integratormotherboard" original-name="Integrator Motherboard" long-name="Integrator Motherboard" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="60702">
+ <unit bldFile="os/boardsupport/integratorbsp/integratormotherboard" mrp="os/boardsupport/integratorbsp/integratormotherboard/base_integrator_integratorap.mrp"/>
+ </component>
+ <component name="integratorcoremodules" original-name="Integrator Core Modules" long-name="Integrator Core Modules" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2177">
+ <unit bldFile="os/boardsupport/integratorbsp/integratorcoremodules" mrp="os/boardsupport/integratorbsp/integratorcoremodules/base_integrator_core_8.1b.mrp"/>
+ </component>
+ <component name="integratorarm920coremodule" original-name="Integrator ARM920 Core Module" long-name="Integrator ARM920 Core Module" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="32739">
+ <unit bldFile="os/boardsupport/integratorbsp/integratorarm920coremodule" mrp="os/boardsupport/integratorbsp/integratorarm920coremodule/base_integrator_core_cm920.mrp"/>
+ </component>
+ <component name="integratorarm1136coremodule" original-name="Integrator ARM1136 Core Module" long-name="Integrator ARM1136 Core Module" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="16358">
+ <unit bldFile="os/boardsupport/integratorbsp/integratorarm1136coremodule" mrp="os/boardsupport/integratorbsp/integratorarm1136coremodule/base_integrator_core_cm1136.mrp"/>
+ </component>
+ <component name="integratorxx600logicmodule" original-name="Integrator XX600 Logic Module" long-name="Integrator XX600 Logic Module" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="59142">
+ <unit bldFile="os/boardsupport/integratorbsp/integratorxx600logicmodule" mrp="os/boardsupport/integratorbsp/integratorxx600logicmodule/base_integrator_logic_lmxx600.mrp"/>
+ </component>
+ <component name="integratorssrnandlogicmodule" original-name="Integrator SSR NAND Logic Module" long-name="Integrator SSR NAND Logic Module" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="25225">
+ <unit bldFile="os/boardsupport/integratorbsp/integratorssrnandlogicmodule" mrp="os/boardsupport/integratorbsp/integratorssrnandlogicmodule/base_integrator_logic_lmnand.mrp"/>
+ </component>
+ <component name="integratorpanasoniclogicmodule" original-name="Integrator Panasonic Logic Module" long-name="Integrator Panasonic Logic Module" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" introduced="8.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Panasonic; Panasonic" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Panasonic; Panasonic" in_production_device_rom="yes" platform_critical="no" source_size="73240">
+ <unit mrp="os/boardsupport/integratorbsp/integratorpanasoniclogicmodule/base_integrator_logic_lm_pana.mrp"/>
+ </component>
+ <component name="integratorunistore2nandlogicmodule" original-name="Integrator Unistore2 NAND Logic Module" long-name="Integrator Unistore2 NAND Logic Module" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="Integrator BSP" comment="" introduced="8.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Samsung Electronics" in_production_device_rom="yes" platform_critical="no" source_size="24305">
+ <unit bldFile="os/boardsupport/integratorbsp/integratorunistore2nandlogicmodule" mrp="os/boardsupport/integratorbsp/integratorunistore2nandlogicmodule/base_integrator_logic_lmnand2.mrp"/>
+ </component>
+ </collection>
+ <collection name="omaph2" original-name="OMAP H2" long-name="OMAP H2" id="OMAP H2" level="bsp" contribution="contributed">
+ <component name="omaph2bsp" original-name="OMAP H2 BSP" long-name="OMAP H2 BSP" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H2" comment="" introduced="9.0" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Texas Instruments; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Texas Instruments; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="2055150">
+ <unit bldFile="os/boardsupport/omaph2/omaph2bsp/h2" mrp="os/boardsupport/omaph2/omaph2bsp/h2/base_omaph2.mrp"/>
+ </component>
+ <component name="omaph2unistore2" original-name="OMAP H2 Unistore2" long-name="OMAP H2 Unistore2" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H2" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics; Samsung; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung Electronics; Samsung; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="16028">
+ <unit bldFile="os/boardsupport/omaph2/omaph2unistore2" mrp="os/boardsupport/omaph2/omaph2unistore2/base_h2_unistore2.mrp"/>
+ </component>
+ <component name="omaph2sdio" original-name="OMAP H2 SDIO" long-name="OMAP H2 SDIO" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H2" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Samsung; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="2328">
+ <unit bldFile="os/boardsupport/omaph2/omaph2sdio" mrp="os/boardsupport/omaph2/omaph2sdio/base_h2_sdio.mrp"/>
+ </component>
+ </collection>
+ <collection name="omaph4" original-name="OMAP H4" long-name="OMAP H4" id="OMAP H4" level="bsp" contribution="contributed">
+ <component name="omaph4bsp" original-name="OMAP H4 BSP" long-name="OMAP H4 BSP" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H4" comment="" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Texas Instruments; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Texas Instruments; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="3797460">
+ <unit bldFile="os/boardsupport/omaph4/omaph4bsp/h4" mrp="os/boardsupport/omaph4/omaph4bsp/h4/base_omaph4hrp.mrp"/>
+ </component>
+ <component name="h4bootloader" original-name="H4 Boot Loader" long-name="H4 Boot Loader" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H4" comment="" introduced="9.1" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Texas Instruments; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Texas Instruments; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="7628">
+ <unit mrp="os/boardsupport/omaph4/h4bootloader/base_omaph4hrp_bootldr.mrp" bldFile="os/boardsupport/omaph4/h4bootloader"/>
+ </component>
+ <component name="omaph4minienvbootloader" original-name="OMAP H4 Mini Environment Boot Loader" long-name="OMAP H4 Mini Environment Boot Loader" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H4" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Texas Instruments; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Texas Instruments; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="12680">
+ <unit mrp="os/boardsupport/omaph4/omaph4minienvbootloader/base_omaph4hrp_mebootldr.mrp" bldFile="os/boardsupport/omaph4/omaph4minienvbootloader"/>
+ </component>
+ <component name="omaph4unistore2" original-name="OMAP H4 Unistore2" long-name="OMAP H4 Unistore2" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H4" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Samsung Electronics; Samsung; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Samsung Electronics; Samsung; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="36626">
+ <unit bldFile="os/boardsupport/omaph4/omaph4unistore2" mrp="os/boardsupport/omaph4/omaph4unistore2/base_omaph4hrp_unistore2.mrp"/>
+ </component>
+ <component name="omaph4sdio" original-name="OMAP H4 SDIO" long-name="OMAP H4 SDIO" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP H4" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Texas Instruments; Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Texas Instruments; Texas Instruments" in_production_device_rom="yes" platform_critical="no" source_size="4813">
+ <unit bldFile="os/boardsupport/omaph4/omaph4sdio" mrp="os/boardsupport/omaph4/omaph4sdio/base_omaph4hrp_sdio.mrp"/>
+ </component>
+ </collection>
+ <collection name="omap3variants" original-name="OMAP3 Variants" long-name="OMAP3 Variants" id="OMAP3 Variants" level="bsp" contribution="contributed">
+ <component name="tiomap3bsp" original-name="TI OMAP3 BSP" long-name="TI OMAP3 BSP" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP3 Variants" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/cedgen/base/tiomap3/variant/34xx_sdp" mrp="os/unref/orphan/cedgen/base/tiomap3/base_tiomap3.mrp"/>
+ </component>
+ <component name="tiomap3unistore2" original-name="TI OMAP3 Unistore2" long-name="TI OMAP3 Unistore2" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="OMAP3 Variants" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/cedgen/base/tiomap3/variant/34xx_sdp_restricted/unistore2" mrp="os/unref/orphan/cedgen/base/tiomap3/base_tiomap3_unistore2.mrp"/>
+ </component>
+ </collection>
+ <collection name="navienginebaseport" original-name="NaviEngine Baseport" long-name="NaviEngine Baseport" id="NaviEngine Baseport" level="bsp" contribution="contributed">
+ <component name="navienginebsp" original-name="NaviEngine BSP" long-name="NaviEngine BSP" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="NaviEngine Baseport" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="no">
+ <unit version="Source_Only" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/base_naviengine_source_only.mrp"/>
+ <unit version="Built" bldFile="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/base_naviengine.mrp"/>
+ </component>
+ <component name="navienginebspflexible" original-name="NaviEngine BSP flexible" long-name="NaviEngine BSP flexible" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="NaviEngine Baseport" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="no">
+ <unit version="Built" bldFile="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb/flexible" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb/flexible/base_naviengine_flexible.mrp"/>
+ <unit version="Source_Only" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb/flexible/base_naviengine_flexible_source_only.mrp"/>
+ </component>
+ <component name="navienginebootloader" original-name="NaviEngine Boot Loader" long-name="NaviEngine Boot Loader" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="NaviEngine Baseport" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="no" source_size="9703">
+ <unit version="Built" bldFile="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_bootloader" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_bootloader/base_ne1_tb_bootldr.mrp"/>
+ <unit version="Source_Only" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_bootloader/base_ne1_tb_bootldr_source_only.mrp"/>
+ </component>
+ <component name="naviengineunistore2" original-name="NaviEngine Unistore2" long-name="NaviEngine Unistore2" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="NaviEngine Baseport" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="no">
+ <unit version="Built" bldFile="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2/base_nec_naviengine_unistore2.mrp"/>
+ <unit version="Source_Only" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2/base_nec_naviengine_unistore2_source_only.mrp"/>
+ </component>
+ <component name="naviengineunistore2flexible" original-name="NaviEngine Unistore2 Flexible" long-name="NaviEngine Unistore2 Flexible" old_model="MCL" old_layer="Hardware" old_package="Board Support Packages" old_collection="NaviEngine Baseport" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="no">
+ <unit version="Built" bldFile="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2/flexible" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2/flexible/base_nec_naviengine_unistore2_flexible.mrp"/>
+ <unit version="Source_Only" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2/flexible/base_nec_naviengine_unistore2_flexible_source_only.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block name="ossrv" levels="physical-abstraction app-libs encoding translation data-services utilities" contribution="contributed" long-name="Generic OS Services" tech_domain="hb" level="services">
+ <collection name="SysLibs API Tests" level="utilities" contribution="contributed">
+ <component name="SysLibs SVS" source="yes" license="UIQ SDK 3.1" comment="Some headers and source files from UIQ SDK 3.1" mcl_component="Syslibs Test Product" impl_language="os" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Zlib License" license_status="No" ship_license="No" license_type="OSS" partial_contribution="">
+ <unit root="MCL" mrp="os/unref/comgen/syslibs/testproduct/group/syslibs_testproduct.mrp"/>
+ <unit root="TCL" mrp="tools/test/suites/technology/syslibs/group/testproduct_syslibs.mrp"/>
+ </component>
+ </collection>
+ <collection name="utilitylibraries" long-name="Utility Libraries" id="libutils.dll=binary" level="encoding" contribution="contributed">
+ <component name="utilitylibraries compo" old_model="s60" old_layer="mw" old_package="utilitylibraries" old_collection="libutils.dll=binary" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="dbus" id="dbus" long-name="Dbus" level="utilities" contribution="available" copyright_holder="OSS" license="AFL" license_type="OSS" license_status="all" source="yes">
+ <component name="libdbus.dll=binary" old_model="s60" old_layer="mw" old_package="ofdbus" old_collection="dbus" comment="" contribution="available" copyright_holder="OSS" license="AFL" license_type="OSS" license_status="all" source="yes"/>
+ <component name="libdbus-utils.dll=binary" old_model="s60" old_layer="mw" old_package="ofdbus" old_collection="dbus" comment="" contribution="available" copyright_holder="OSS" license="AFL" license_type="OSS" license_status="all" source="yes"/>
+ <component name="dbusdaemon.exe=binary" old_model="s60" old_layer="mw" old_package="ofdbus" old_collection="dbus" comment="" contribution="available" copyright_holder="OSS" license="AFL" license_type="OSS" license_status="all" source="yes"/>
+ </collection>
+ <collection name="dbus-glib" id="dbus-glib" long-name="Dbus-glib" level="utilities" contribution="available" copyright_holder="OSS" license="AFL" license_type="OSS" license_status="all" source="yes">
+ <component name="libdbus-glib.dll=binary" old_model="s60" old_layer="mw" old_package="ofdbus" old_collection="dbus-glib" comment="" contribution="available" copyright_holder="OSS" license="AFL" license_type="OSS" license_status="all" source="yes"/>
+ </collection>
+ <collection name="glib" id="glib" long-name="Glib" level="utilities" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS" license_status="all" source="yes">
+ <component name="glibbackend" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="glib" comment="" contribution="available" copyright_holder="Nokia" license="LGPL" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\glib\glibbackend" source_size="8048.7"/>
+ <component name="libglib" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="glib" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\glib\libglib" source_size="1280575.8"/>
+ <component name="libgmodule" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="glib" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\glib\libgmodule" source_size="8781.9"/>
+ <component name="libgobject" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="glib" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\glib\libgobject" source_size="220883.7"/>
+ <component name="libgthread" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="glib" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\glib\libgthread" source_size="10305.0"/>
+ </collection>
+ <collection name="ssl" id="ssl" long-name="SSL" level="data-services" contribution="available" copyright_holder="OSS" license="BSD/MIT style license" license_type="OSS" license_status="all" source="yes">
+ <component name="libcrypto" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="ssl" comment="" contribution="available" copyright_holder="OSS" license="BSD/MIT style license" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\ssl\libcrypto" source_size="2232186.3"/>
+ <component name="libssl" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="ssl" comment="" contribution="available" copyright_holder="OSS" license="BSD/MIT style license" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\ssl\libssl" source_size="376805.1"/>
+ </collection>
+ <collection name="stdcpp" id="stdcpp" long-name="Stdcpp" level="translation" contribution="available" copyright_holder="OSS" license="BSD" license_type="OSS" license_status="all" source="yes">
+ <component name="libstdcpp.dll=binary" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="stdcpp" comment="" contribution="available" copyright_holder="OSS" license="BSD" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\stdcpp\libstdcpp.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="stdlibs" id="stdlibs" long-name="Stdlibs" level="translation" contribution="available" copyright_holder="OSS" license="BSD" license_type="OSS" license_status="all" source="yes">
+ <component name="libcrypt" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="stdlibs" comment="" contribution="available" copyright_holder="OSS" license="BSD" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\stdlibs\libcrypt" source_size="49434.3"/>
+ <component name="libz" old_model="s60" old_layer="osext" old_package="mobileruntime" old_collection="stdlibs" comment="" contribution="available" copyright_holder="OSS" license="BSD" license_type="OSS" license_status="all" source="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mobileruntime\stdlibs\libz" source_size="297920.1"/>
+ </collection>
+ <collection name="genericservices" original-name="Generic Services" long-name="Generic Services" id="Generic Services" level="utilities" contribution="contributed">
+ <component name="s60compatibilityheaders" original-name="S60 Compatibility Headers" long-name="S60 Compatibility Headers" id="S60 Compatibility Headers" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="Tools and Utils" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="127870">
+ <unit version="9.5" bldFile="os/ossrv/genericservices/s60compatibilityheaders/group95" mrp="os/ossrv/genericservices/s60compatibilityheaders/group95/tools_s60_header_compat95.mrp"/>
+ <unit version="Future" bldFile="os/ossrv/genericservices/s60compatibilityheaders/groupfuture" mrp="os/ossrv/genericservices/s60compatibilityheaders/groupfuture/tools_s60_header_compatfuture.mrp"/>
+ <unit mrp="os/ossrv/genericservices/s60compatibilityheaders/group94/tools_s60_header_compat94.mrp" removed="9.5" version="9.4" bldFile="os/ossrv/genericservices/s60compatibilityheaders/group94"/>
+ <unit mrp="os/ossrv/genericservices/s60compatibilityheaders/group96/tools_s60_header_compat96.mrp" version="9.6" bldFile="os/ossrv/genericservices/s60compatibilityheaders/group96"/>
+ <unit version="9.4" bldFile="os/ossrv/genericservices/s60compatibilityheaders/group94" mrp="os/ossrv/genericservices/s60compatibilityheaders/group94/tools_s60_header_compat94.mrp"/>
+ </component>
+ <component name="mimerecognitionfw" original-name="MIME Recognition Framework" long-name="MIME Recognition Framework" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Services" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="60882">
+ <unit bldFile="os/ossrv/genericservices/mimerecognitionfw/group" mrp="os/ossrv/genericservices/mimerecognitionfw/group/app-framework_emime.mrp"/>
+ </component>
+ <component name="systemagent" original-name="System Agent" long-name="System Agent" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Services" comment="" introduced="9.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="135820">
+ <unit bldFile="os/ossrv/genericservices/systemagent/group" mrp="os/ossrv/genericservices/systemagent/group/syslibs_sysagent2.mrp"/>
+ </component>
+ <component name="taskscheduler" original-name="Task Scheduler" long-name="Task Scheduler" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Services" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="754997">
+ <unit bldFile="os/ossrv/genericservices/taskscheduler/group" mrp="os/ossrv/genericservices/taskscheduler/group/syslibs_schsvr.mrp"/>
+ </component>
+ <component name="activebackupclient" original-name="Active Backup Client" long-name="Active Backup Client" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Services" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="18504">
+ <unit bldFile="os/ossrv/genericservices/activebackupclient/group" mrp="os/ossrv/genericservices/activebackupclient/group/connectivity_abclient.mrp"/>
+ </component>
+ <component name="syslibsdocs" original-name="Syslibs Documentation" long-name="Syslibs Documentation" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Services" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="212071">
+ <unit mrp="os/ossrv/genericservices/syslibsdocs/syslibs_documentation.mrp"/>
+ </component>
+ <component name="httputils" original-name="HTTP Utilities Library" long-name="HTTP Utilities Library" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Services" comment="" introduced="6.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="564682">
+ <unit bldFile="os/ossrv/genericservices/httputils/group" mrp="os/ossrv/genericservices/httputils/group/application-protocols_inetprotutil.mrp"/>
+ </component>
+ </collection>
+ <collection name="compressionlibs" original-name="Compression Libraries" long-name="Compression Libraries" id="Compression Libraries" level="data-services" contribution="contributed">
+ <component name="ziplib" original-name="Zip Compression Library" long-name="Zip Compression Library" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Compression Libraries" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="42137143">
+ <unit mrp="os/ossrv/compressionlibs/ziplib/group/syslibs_ezlib.mrp" version="1" removed="9.5" bldFile="os/ossrv/compressionlibs/ziplib/group"/>
+ <unit mrp="os/ossrv/compressionlibs/ziplib2/group/syslibs_ezlib2.mrp" version="2" bldFile="os/ossrv/compressionlibs/ziplib2/group"/>
+ <unit bldFile="os/ossrv/compressionlibs/ziplib/group" mrp="os/ossrv/compressionlibs/ziplib/group/syslibs_ezlib.mrp"/>
+ </component>
+ </collection>
+ <collection name="genericopenlibs" original-name="Generic Open Libraries" long-name="Generic Open Libraries" id="Generic Open Libraries" level="translation" contribution="contributed">
+ <component name="cstdlib" original-name="C Standard Library" long-name="C Standard Library" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Open Libraries" comment="" introduced="ER5" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="Various OSS" license_status="Open" ship_license="No" source="yes" partial_contribution="" license="FreeBSD; BSD 2.0; Digital Equipment Corporation; The Regents of the University of California; International Business Machines Inc." in_production_device_rom="yes" platform_critical="no" source_size="520877">
+ <unit bldFile="os/ossrv/genericopenlibs/cstdlib/group" mrp="os/ossrv/genericopenlibs/cstdlib/group/syslibs_stdlib.mrp"/>
+ </component>
+ <component name="cppstdlib" original-name="C++ Standard Library" long-name="C++ Standard Library" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Open Libraries" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1507799">
+ <unit bldFile="os/unref/orphan/comgen/openenv/stdcpp/group" mrp="os/unref/orphan/comgen/openenv/stdcpp/group/openenv_libstdcpp.mrp"/>
+ </component>
+ <component name="openenvcore" original-name="Open Environment Core" long-name="Open Environment Core" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Open Libraries" comment="" introduced="9.4" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="Open Group; Various OSS" license_status="Open" ship_license="No" source="no" partial_contribution="no" license="Open Group; OSS (Various" in_production_device_rom="yes" platform_critical="yes" source_size="4934249">
+ <unit bldFile="os/ossrv/genericopenlibs/openenvcore/group" mrp="os/ossrv/genericopenlibs/openenvcore/group/openenv.mrp"/>
+ </component>
+ <component name="pluggableauthenticationmodulefw" original-name="Pluggable Authentication Module Framework" long-name="Pluggable Authentication Module Framework" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Open Libraries" comment="" class="placeholder" introduced="Future" contribution="contributed" in_production_device_rom="yes"/>
+ <component name="posixrealtimeextensions" original-name="POSIX Realtime Extensions" long-name="POSIX Realtime Extensions" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Generic Open Libraries" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/openenv/oeaddons/librt/group" mrp="os/unref/orphan/comgen/openenv/oeaddons/librt/group/oeaddons_librt.mrp"/>
+ </component>
+ </collection>
+ <collection name="lowlevellibsandfws" original-name="Low Level Libraries and Frameworks" long-name="Low Level Libraries and Frameworks" id="Low Level Libraries and Frameworks" level="app-libs" contribution="contributed">
+ <component name="pluginfw" original-name="Plugin Framework" long-name="Plugin Framework" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Low Level Libraries and Frameworks" comment="" introduced="6.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="4310171">
+ <unit version="3" bldFile="os/unref/orphan/comgen/syslibs/ecom3/Group" mrp="os/unref/orphan/comgen/syslibs/ecom3/Group/syslibs_ecom3.mrp"/>
+ <unit mrp="os/ossrv/lowlevellibsandfws/pluginfw/Group/syslibs_ecom.mrp" removed="9.5" version="2" bldFile="os/ossrv/lowlevellibsandfws/pluginfw/Group"/>
+ <unit version="2" bldFile="os/ossrv/lowlevellibsandfws/pluginfw/Group" mrp="os/ossrv/lowlevellibsandfws/pluginfw/Group/syslibs_ecom.mrp"/>
+ </component>
+ <component name="apputils" original-name="Application Utilities" long-name="Application Utilities" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Low Level Libraries and Frameworks" comment="" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="6659808">
+ <unit bldFile="os/ossrv/lowlevellibsandfws/apputils/group" mrp="os/ossrv/lowlevellibsandfws/apputils/group/syslibs_bafl.mrp"/>
+ </component>
+ <component name="genericusabilitylib" original-name="Generic Usability Library" long-name="Generic Usability Library" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Low Level Libraries and Frameworks" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/syslibs/euserhl/group" mrp="os/unref/orphan/comgen/syslibs/euserhl/group/syslibs_euserhl.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="OS Security" tech_domain="se" level="services" name="security" levels="physical-abstraction plugins libraries management services utilities" contribution="contributed">
+ <collection name="authorisation" original-name="Authorisation" long-name="Authorisation" id="Authorisation" level="utilities" contribution="contributed">
+ <component name="userpromptservice" original-name="User Prompt Service" long-name="User Prompt Service" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Authorisation" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="472862">
+ <unit bldFile="os/unref/orphan/comgen/security/ups/group" mrp="os/unref/orphan/comgen/security/ups/group/security_ups.mrp"/>
+ </component>
+ <component name="userpromptutils" original-name="User Prompt Utils" long-name="User Prompt Utils" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Authorisation" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="6487">
+ <unit bldFile="os/unref/orphan/comgen/security/ups/upsutils/group" mrp="os/unref/orphan/comgen/security/ups/upsutils/group/security_ups_utils.mrp"/>
+ </component>
+ </collection>
+ <collection name="contentmgmt" original-name="Content Management" long-name="Content Management" id="Content Management" level="utilities" contribution="contributed">
+ <component name="contentaccessfwfordrm" original-name="Content Access Framework for DRM" long-name="Content Access Framework for DRM" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Content Management" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1519153">
+ <unit bldFile="os/security/contentmgmt/contentaccessfwfordrm/group" mrp="os/security/contentmgmt/contentaccessfwfordrm/group/security_caf2.mrp"/>
+ </component>
+ <component name="cafrecogniserconfig" original-name="CAF Recogniser Config" long-name="CAF Recogniser Config" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Content Management" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" in_production_device_rom="yes" platform_critical="yes" source_size="0">
+ <unit bldFile="os/security/contentmgmt/cafrecogniserconfig" mrp="os/security/contentmgmt/cafrecogniserconfig/security_reccafconfig.mrp"/>
+ </component>
+ <component name="XHive" desktop="yes" source="no" partial_contribution="no" license_type="commercial" license_status="no" copyright_holder="http://www.x-hive.com/" license="Copyright © 1996 - 2007 X-Hive Corporation (http://www.x-hive.com/)" comment="3rd party content management system that is used by Symbian to store content." impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" contribution="excluded"/>
+ </collection>
+ <collection name="cryptolibs" original-name="Crypto Libraries" long-name="Crypto Libraries" id="Crypto Libraries" level="libraries" contribution="contributed">
+ <component name="weakcryptolib" original-name="Weak Cryptography Library" long-name="Weak Cryptography Library" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Libraries" comment="" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/security/cryptolibs/weakcryptolib/group/security_crypto_weak.mrp" bldFile="os/security/cryptolibs/weakcryptolib/group"/>
+ </component>
+ <component name="strongcryptolib" original-name="Strong Cryptography Library" long-name="Strong Cryptography Library" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Libraries" comment="" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/security/cryptolibs/weakcryptolib/group/security_crypto_strong.mrp" bldFile="os/security/cryptolibs/weakcryptolib/strong"/>
+ </component>
+ <component name="weakcryptospi" original-name="Weak Crypto SPI" long-name="Weak Crypto SPI" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Libraries" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" in_production_device_rom="yes" platform_critical="no" source_size="0">
+ <unit bldFile="os/security/cryptolibs/weakcryptolibspi/group" mrp="os/security/cryptolibs/weakcryptolibspi/group/security_cryptospi_weak.mrp"/>
+ </component>
+ <component name="strongcryptospi" original-name="Strong Crypto SPI" long-name="Strong Crypto SPI" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Libraries" comment="" introduced="9.5" contribution="excluded" not_used_by_s60="" export_restricted="yes" license_type="commercial" copyright_holder="RSA Security" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="RSA Security" in_production_device_rom="yes" platform_critical="no" source_size="3623667">
+ <unit bldFile="os/security/cryptolibs/weakcryptolibspi/strong" mrp="os/security/cryptolibs/weakcryptolibspi/group/security_cryptospi_strong.mrp"/>
+ </component>
+ <component name="opencryptolibs" original-name="Open Crypto Libraries" long-name="Open Crypto Libraries" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Libraries" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="7998668">
+ <unit bldFile="os/unref/orphan/comgen/openenv/oeaddons/crypto/group" mrp="os/unref/orphan/comgen/openenv/oeaddons/crypto/group/oeaddons_crypto.mrp"/>
+ </component>
+ </collection>
+ <collection name="cryptomgmtlibs" original-name="Crypto Management Libraries" long-name="Crypto Management Libraries" id="Crypto Management Libraries" level="management" contribution="contributed">
+ <component name="securityutils" original-name="Security Utils" long-name="Security Utils" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Management Libraries" comment="" introduced="8.0" contribution="contributed" not_used_by_s60="" export_restricted="yes" in_production_device_rom="yes" platform_critical="no" source_size="53340">
+ <unit bldFile="os/security/cryptomgmtlibs/securityutils/group" mrp="os/security/cryptomgmtlibs/securityutils/group/security_common.mrp"/>
+ </component>
+ <component name="securitydocs" original-name="Security Documentation" long-name="Security Documentation" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Management Libraries" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="8853625">
+ <unit mrp="os/security/cryptomgmtlibs/securitydocs/security_documentation.mrp"/>
+ </component>
+ <component name="securityconfig" original-name="Security Config" long-name="Security Config" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Management Libraries" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="33261">
+ <unit bldFile="os/security/cryptomgmtlibs/securityconfig/group" mrp="os/security/cryptomgmtlibs/securityconfig/group/security_config.mrp"/>
+ </component>
+ <component name="cryptotokenfw" original-name="Crypto Token Framework" long-name="Crypto Token Framework" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Management Libraries" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="162966">
+ <unit bldFile="os/security/cryptomgmtlibs/cryptotokenfw/group" mrp="os/security/cryptomgmtlibs/cryptotokenfw/group/security_cryptotokens.mrp"/>
+ </component>
+ <component name="securitycommonutils" original-name="Security Common Utils" long-name="Security Common Utils" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Management Libraries" comment="" introduced="8.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="102175">
+ <unit bldFile="os/security/cryptomgmtlibs/securityutilsutils/group" mrp="os/security/cryptomgmtlibs/securityutilsutils/group/security_commonutils.mrp"/>
+ </component>
+ </collection>
+ <collection name="cryptoplugins" original-name="Crypto Plugins" long-name="Crypto Plugins" id="Crypto Plugins" level="plugins" contribution="contributed">
+ <component name="cryptospiplugins" original-name="Crypto SPI Plugins" long-name="Crypto SPI Plugins" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Plugins" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="yes" in_production_device_rom="yes" platform_critical="no" source_size="202918">
+ <unit bldFile="os/security/cryptolibs/weakcryptolibspi/plugins/group" mrp="os/security/cryptolibs/weakcryptolibspi/plugins/group/security_cryptospi_plugins.mrp"/>
+ </component>
+ </collection>
+ <collection name="cryptoservices" original-name="Crypto Services" long-name="Crypto Services" id="Crypto Services" level="plugins" contribution="contributed">
+ <component name="certificateandkeymgmt" original-name="Certificate and Key Management" long-name="Certificate and Key Management" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Services" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1973073">
+ <unit bldFile="os/security/cryptoservices/certificateandkeymgmt/group" mrp="os/security/cryptoservices/certificateandkeymgmt/group/security_certman.mrp"/>
+ </component>
+ <component name="filebasedcertificateandkeystores" original-name="File-based Certificate and Key Stores" long-name="File-based Certificate and Key Stores" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Services" comment="" introduced="8.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2377037">
+ <unit bldFile="os/security/cryptoservices/filebasedcertificateandkeystores/group" mrp="os/security/cryptoservices/filebasedcertificateandkeystores/group/security_filetokens.mrp"/>
+ </component>
+ <component name="rootcertificates" original-name="Root Certificates" long-name="Root Certificates" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Services" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="8472">
+ <unit mrp="os/security/cryptoservices/rootcertificates/rootcerts.mrp"/>
+ </component>
+ <component name="asnpkcs" original-name="ASN PKCS" long-name="ASN PKCS" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Services" comment="" introduced="8.0" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Objective Systems Inc" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Objective Systems Inc" in_production_device_rom="yes" platform_critical="no" source_size="29843">
+ <unit bldFile="os/security/cryptoservices/asnpkcs/group" mrp="os/security/cryptoservices/asnpkcs/group/security_asnpkcs.mrp"/>
+ </component>
+ <component name="openssl" original-name="OpenSSL" long-name="OpenSSL" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Crypto Services" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="482763">
+ <unit bldFile="os/unref/orphan/comgen/openenv/oeaddons/ssl/group" mrp="os/unref/orphan/comgen/openenv/oeaddons/ssl/group/oeaddons_ssl.mrp"/>
+ </component>
+ </collection>
+ <collection name="authenticationservices" original-name="Authentication Services" long-name="Authentication Services" id="Authentication Services" level="utilities" contribution="contributed">
+ <component name="authenticationserver" original-name="Authentication Server" long-name="Authentication Server" old_model="MCL" old_layer="OS Services" old_package="Security and Data Privacy" old_collection="Authentication Services" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/security/authserver/group" mrp="os/unref/orphan/comgen/security/authserver/group/security_authserver.mrp"/>
+ </component>
+ </collection>
+ <collection name="securityanddataprivacytools" original-name="Security and Data Privacy Tools" long-name="Security and Data Privacy Tools" id="Security and Data Privacy Tools" level="services" contribution="contributed">
+ <component name="securitytools" original-name="Security Tools" long-name="Security Tools" old_model="MCL" old_layer="MISC" old_package="PC Tools" old_collection="Security and Data Privacy Tools" comment="" class="PC" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="203522">
+ <unit bldFile="os/security/securityanddataprivacytools/securitytools/group" mrp="os/security/securityanddataprivacytools/securitytools/group/security_tools.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="XML Services" tech_domain="rt" level="services" name="xmlsrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="xmlengine" id="xmlengine" long-name="XML Engine" level="server" contribution="contributed">
+ <component name="domxpathwrapper" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlengine\domxpathwrapper" source_size="1027983.9"/>
+ <component name="libxml2" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlengine" comment="" contribution="available" copyright_holder="OSS" license="MIT open source license" license_status="all" source="yes" license_type="OSS" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlengine\libxml2" source_size="1046920.5"/>
+ <component name="xmlenginesaxplugin" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlengine\xmlenginesaxplugin" source_size="64541.4"/>
+ <component name="xmlengineserializer" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlengine\xmlengineserializer" source_size="505456.5"/>
+ <component name="xmlengineutils" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlengine\xmlengineutils" source_size="109294.5"/>
+ </collection>
+ <collection name="xmlsecurityengine" id="xmlsecurityengine" long-name="XML Security Engine" level="framework" contribution="contributed">
+ <component name="xmlsec" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlsecurityengine" comment="" contribution="available" copyright_holder="OSS" license="MIT open source license" license_status="all" source="yes" license_type="OSS" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlsecurityengine\xmlsec" source_size="454678.2"/>
+ <component name="xmlseccertman" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlsecurityengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlsecurityengine\xmlseccertman" source_size="85245.3"/>
+ <component name="xmlseccrypto" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlsecurityengine" comment="" contribution="available" copyright_holder="OSS" license="MIT open source license" license_type="OSS" license_status="all" source="yes" export_restricted="yes" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlsecurityengine\xmlseccrypto" source_size="163658.1"/>
+ <component name="xmlsecwrapper" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlsecurityengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlsecurityengine\xmlsecwrapper" source_size="112003.8"/>
+ </collection>
+ <collection name="xml" original-name="XML" long-name="XML" id="XML" level="generic" contribution="contributed">
+ <component name="xmlfw" original-name="XML Framework" long-name="XML Framework" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="XML" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="469347">
+ <unit bldFile="os/xmlsrv/xml/xmlfw/group" mrp="os/xmlsrv/xml/xmlfw/group/syslibs_xml.mrp"/>
+ </component>
+ <component name="libxml2libs" original-name="Libxml2 Libraries" long-name="Libxml2 Libraries" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="XML" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/syslibs/xml/libxml2/group" mrp="os/unref/orphan/comgen/syslibs/xml/libxml2/group/syslibs_libxml2.mrp"/>
+ </component>
+ <component name="xmldomandxpath" original-name="XML DOM and XPath" long-name="XML DOM and XPath" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="XML" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/syslibs/xml/xmldom/group" mrp="os/unref/orphan/comgen/syslibs/xml/xmldom/group/syslibs_xmldom.mrp"/>
+ </component>
+ <component name="xmlexpatparser" original-name="XML Expat Parser" long-name="XML Expat Parser" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="XML" comment="" plugin="Y" introduced="7.0s" contribution="contributed" in_production_device_rom="yes" source_size="384440">
+ <unit bldFile="os/xmlsrv/xml/xmlexpatparser/group" mrp="os/xmlsrv/xml/xmlexpatparser/group/syslibs_xmlparser.mrp"/>
+ </component>
+ <component name="xmllibxml2parser" original-name="XML Libxml2 Parser" long-name="XML Libxml2 Parser" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="XML" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/xmlsrv/xml/xmlexpatparser2/group" mrp="os/xmlsrv/xml/xmlexpatparser2/group/syslibs_xmlparser2.mrp"/>
+ </component>
+ <component name="wbxmlparser" original-name="WBXML Parser" long-name="WBXML Parser" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="XML" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="372088">
+ <unit bldFile="os/xmlsrv/xml/wbxmlparser/group" mrp="os/xmlsrv/xml/wbxmlparser/group/syslibs_wbxmlparser.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Persistent Data Services" tech_domain="hb" level="services" name="persistentdata" levels="adaptation hw-if plugin framework server app-if" contribution="contributed">
+ <collection name="featuremgmt" id="Feature Management" long-name="Feature Management" level="framework" contribution="contributed">
+ <component name="featuremanager" long-name="Feature Manager" id="featuremanager" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="commonservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\commonservices\featuremanager" source_size="298913.4"/>
+ <component name="featuremgr" original-name="Feature Manager" long-name="Feature Manager" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Feature Management" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2156620">
+ <unit bldFile="os/unref/orphan/comgen/syslibs/featmgr/group" mrp="os/unref/orphan/comgen/syslibs/featmgr/group/syslibs_featmgr.mrp"/>
+ </component>
+ <component name="featureregistry" original-name="Feature Registry" long-name="Feature Registry" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Feature Management" comment="" introduced="9.2" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="354845">
+ <unit bldFile="os/persistentdata/featuremgmt/featureregistry/group" mrp="os/persistentdata/featuremgmt/featureregistry/group/syslibs_featreg.mrp"/>
+ </component>
+ </collection>
+ <collection name="databaseabstraction" original-name="Database Abstraction" long-name="Database Abstraction" id="Database Abstraction" level="app-if" contribution="contributed">
+ <component name="dbmsemulationlib" original-name="DBMS Emulation Library" long-name="DBMS Emulation Library" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Database Abstraction" comment="" introduced="9.3" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="717278">
+ <unit bldFile="os/persistentdata/databaseabstraction/dbmsemulationlib/group" mrp="os/persistentdata/databaseabstraction/dbmsemulationlib/group/syslibs_dbmssql.mrp"/>
+ </component>
+ </collection>
+ <collection name="loggingservices" original-name="Logging Services" long-name="Logging Services" id="Logging Services" level="server" contribution="contributed">
+ <component name="eventlogger" original-name="Event Logger" long-name="Event Logger" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Logging Services" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="524074">
+ <unit bldFile="os/persistentdata/loggingservices/eventlogger/group" mrp="os/persistentdata/loggingservices/eventlogger/group/syslibs_logeng.mrp"/>
+ </component>
+ <component name="filelogger" original-name="File Logger" long-name="File Logger" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Logging Services" comment="" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="104153">
+ <unit bldFile="os/persistentdata/loggingservices/filelogger/group" mrp="os/persistentdata/loggingservices/filelogger/group/comms-infras_flogger.mrp"/>
+ </component>
+ </collection>
+ <collection name="traceservices" original-name="Trace Services" long-name="Trace Services" id="Trace Services" level="server" contribution="contributed">
+ <component name="commsdebugutility" original-name="Comms Debug Utility" long-name="Comms Debug Utility" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Trace Services" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1264941">
+ <unit bldFile="os/persistentdata/traceservices/commsdebugutility/group" mrp="os/persistentdata/traceservices/commsdebugutility/group/comms-infras_commsdebugutility.mrp"/>
+ </component>
+ <component name="utrace" original-name="UTRACE" long-name="UTrace" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Trace Services" comment="" introduced="9.3" deprecated="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="178827">
+ <unit bldFile="os/persistentdata/traceservices/utrace/group" mrp="os/persistentdata/traceservices/utrace/group/testtools_utrace_api.mrp"/>
+ </component>
+ <component name="tracefw" original-name="Trace Framework" long-name="Trace Framework" source="yes" partial_contribution="yes" license_type="commercial" license_status="no" license="Various commercial" comment="Contains various desktop executables on /trace/ulogger/src/outfrwkchans/usb/pcside and various executables for testing (e.g. rawseriallogger)" impl_language="os" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="partial" in_production_device_rom="no" platform_critical="no" source_size="474827">
+ <unit root="TCL" bldFile="tools/debug/trace/ulogger/group" mrp="tools/debug/trace/ulogger/group/tools_debug_trace_ext.mrp"/>
+ <unit bldFile="os/persistentdata/traceservices/tracefw/ulogger/group" mrp="os/persistentdata/traceservices/tracefw/ulogger/group/tools_debug_trace.mrp"/>
+ </component>
+ <component name="System Monitor" license="UIQ SDK 3.1 (contains UIQ SDK headers for UIQ UI)" comment="Contains some UIQ SDK 3.1 headers for UIQ UI" mcl_component="SYSTEMMONITOR" impl_language="os" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/unref/comtt/systemmonitor/group" mrp="os/unref/comtt/systemmonitor/group/testtools_systemmonitor.mrp"/>
+ <unit root="TCL" bldFile="tools/test/tools/systemmonitor/group" mrp="tools/test/tools/systemmonitor/group/testtools_systemmonitor.mrp"/>
+ </component>
+ </collection>
+ <collection name="persistentstorage" original-name="Persistent Storage" long-name="Persistent Storage" id="Persistent Storage" level="framework" contribution="contributed">
+ <component name="store" original-name="Store" long-name="Store" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Persistent Storage" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="738993">
+ <unit bldFile="os/persistentdata/persistentstorage/store/group" mrp="os/persistentdata/persistentstorage/store/group/syslibs_store.mrp"/>
+ </component>
+ <component name="dbms" original-name="DBMS" long-name="DBMS" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Persistent Storage" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1493510">
+ <unit bldFile="os/persistentdata/persistentstorage/dbms/group" mrp="os/persistentdata/persistentstorage/dbms/group/syslibs_dbms.mrp"/>
+ </component>
+ <component name="centralrepository" original-name="Central Repository" long-name="Central Repository" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Persistent Storage" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1527316">
+ <unit bldFile="os/persistentdata/persistentstorage/centralrepository/group" mrp="os/persistentdata/persistentstorage/centralrepository/group/syslibs_centralrepository.mrp"/>
+ </component>
+ <component name="sql" original-name="SQL" long-name="SQL" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Persistent Storage" comment="" introduced="9.3" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="SQLite; SQLite" license_status="Open" ship_license="No" source="no" partial_contribution="no" license="SQLite; SQLite" in_production_device_rom="yes" platform_critical="no" source_size="3599929">
+ <unit bldFile="os/persistentdata/persistentstorage/sql/GROUP" mrp="os/persistentdata/persistentstorage/sql/GROUP/syslibs_sql.mrp"/>
+ </component>
+ <component name="sqlite3api" original-name="SQLite 3 API" long-name="SQLite 3 API" old_model="MCL" old_layer="OS Services" old_package="Persistent Data Services" old_collection="Persistent Storage" comment="" introduced="9.5" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="SQLite" license_status="Open" ship_license="No" source="no" partial_contribution="no" license="SQLite" in_production_device_rom="yes" platform_critical="no" source_size="6567656">
+ <unit bldFile="os/persistentdata/persistentstorage/sql/CLIB/GROUP" mrp="os/persistentdata/persistentstorage/sql/CLIB/GROUP/syslibs_sqlite3.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Device Services" tech_domain="hb" level="services" name="devicesrv" levels="adaptation hw-if plugin framework server app-if" contribution="contributed">
+ <collection name="accessoryservices" id="accessoryservices" long-name="Accessory Services" level="framework" contribution="contributed">
+ <component name="remotecontrolfw" original-name="Remote Control Framework" long-name="Remote Control Framework" id="Remote Control Framework" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Accessory Management" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="241680">
+ <unit bldFile="os/devicesrv/accessoryservices/remotecontrolfw/group" mrp="os/devicesrv/accessoryservices/remotecontrolfw/group/bluetooth_remotecontrol.mrp"/>
+ </component>
+ <component name="accessorymonitor" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="accessoryservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\accessoryservices\accessorymonitor" source_size="609192.0"/>
+ <component name="accessoryremotecontrol" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="accessoryservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\accessoryservices\accessoryremotecontrol" source_size="1011667.5"/>
+ <component name="accessoryserver" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="accessoryservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\accessoryservices\accessoryserver" source_size="5268556.8"/>
+ <component name="headsetstatusapi" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="accessoryservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\accessoryservices\headsetstatusapi" source_size="163168.8"/>
+ <component name="tspclientmapper" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="accessoryservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\accessoryservices\tspclientmapper" source_size="116600.7"/>
+ </collection>
+ <collection name="commonservices" id="commonservices" long-name="Common Services" level="app-if" contribution="contributed">
+ <component name="activitymanager" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="commonservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\commonservices\activitymanager" source_size="185973.3"/>
+ <component name="commonengine" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="commonservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\commonservices\commonengine" source_size="1718319.6"/>
+ <component name="commonengineresources" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="commonservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\commonservices\commonengineresources" source_size="174545.4"/>
+ <component name="PlatformEnv" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="commonservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\commonservices\PlatformEnv" source_size="720828.0"/>
+ <component name="sysutil" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="commonservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\commonservices\sysutil" source_size="297437.4"/>
+ </collection>
+ <collection name="dosservices" id="dosservices" long-name="Dos Services" level="hw-if" contribution="contributed">
+ <component name="commondsy" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="dosservices" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="yes" path="\s60\osext\systemswextensions\dosservices\commondsy" source_size="317202.9"/>
+ <component name="dosserver" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="dosservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\dosservices\dosserver" source_size="355395.9"/>
+ </collection>
+ <collection name="resourcemgmt" id="hwresourcemanager" long-name="Resource Management" level="hw-if" contribution="contributed">
+ <component name="ClientDll" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\ClientDll" source_size="8337.0"/>
+ <component name="CommonDll" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\CommonDll" source_size="4909.2"/>
+ <component name="ExtendedLightClientDll" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\ExtendedLightClientDll" source_size="16790.7"/>
+ <component name="FmTxClientDll" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed"/>
+ <component name="ServerExe" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\ServerExe" source_size="135929.1"/>
+ <component name="hwrmfmtxwatcherplugin" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed"/>
+ <component name="VibraClientDll" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\VibraClientDll" source_size="14580.0"/>
+ <component name="LightClientDll" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\LightClientDll" source_size="16044.3"/>
+ <component name="hwrmtargetmodifierplugin" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\hwrmtargetmodifierplugin" source_size="32762.1"/>
+ <component name="vibractrl" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwresourcemanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\hwresourcemanager\vibractrl" source_size="281777.7"/>
+ <component name="hardwareresourcesmgr" original-name="Hardware Resources Manager" long-name="Hardware Resources Manager" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Resource Management" comment="" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2287650">
+ <unit bldFile="os/devicesrv/resourcemgmt/hardwareresourcesmgr/group" mrp="os/devicesrv/resourcemgmt/hardwareresourcesmgr/group/telephony_hwrm.mrp"/>
+ </component>
+ <component name="hardwareresourcesmgrconfig" original-name="Hardware Resources Manager Config" long-name="Hardware Resources Manager Config" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Resource Management" comment="" class="config" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2036">
+ <unit bldFile="os/devicesrv/resourcemgmt/hardwareresourcesmgr/config" mrp="os/devicesrv/resourcemgmt/hardwareresourcesmgr/config/telephony_hwrm-config.mrp"/>
+ </component>
+ <component name="powerandmemorynotificationservice" original-name="Power and Memory Notification Service" long-name="Power and Memory Notification Service" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Resource Management" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="593994">
+ <unit bldFile="os/devicesrv/resourcemgmt/powerandmemorynotificationservice/group" mrp="os/devicesrv/resourcemgmt/powerandmemorynotificationservice/group/syslibs_pwrcli.mrp"/>
+ </component>
+ </collection>
+ <collection name="hwrmhaptics" id="hwrmhaptics" long-name="HWRM Haptics" level="plugin" contribution="contributed">
+ <component name="hapticsclient" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwrmhaptics" comment="" contribution="contributed"/>
+ <component name="hapticslicense" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwrmhaptics" comment="" contribution="contributed"/>
+ <component name="hapticspacketizer" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwrmhaptics" comment="" contribution="contributed"/>
+ <component name="hapticspluginmanager" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwrmhaptics" comment="" contribution="contributed"/>
+ <component name="hapticspluginservice" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwrmhaptics" comment="" contribution="contributed"/>
+ <component name="hapticsserver" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="hwrmhaptics" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="mediator" id="mediator" long-name="Mediator" level="app-if" contribution="contributed">
+ <component name="MediatorPluginBase.dll=binary" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="mediator" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\mediator\MediatorPluginBase.dll=binary" source_size="0.0"/>
+ <component name="MediatorServer.exe=binary" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="mediator" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\mediator\MediatorServer.exe=binary" source_size="0.0"/>
+ <component name="MediatorClient.dll=binary" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="mediator" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\mediator\MediatorClient.dll=binary" source_size="0.0"/>
+ <component name="mediatorclientstub.dll=binary" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="mediator" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\mediator\mediatorclientstub.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="psmservices" id="psmservices" long-name="PSM Services" level="app-if" contribution="contributed">
+ <component name="psmserver" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="psmservices" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="sensorservices" id="sensorservices" long-name="Sensor Services" level="framework" contribution="contributed">
+ <component name="orientationssy" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="sensorservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\sensorservices\orientationssy" source_size="541042.8"/>
+ <component name="sensorserver" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="sensorservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\osext\systemswextensions\sensorservices\sensorserver" source_size="1813076.7"/>
+ <component name="tiltcompensationssy" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="sensorservices" comment="" contribution="contributed"/>
+ <component name="sensorsfw" original-name="Sensors Framework" long-name="Sensors Framework" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Sensors Services" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="242893">
+ <unit bldFile="os/unref/orphan/comgen/syslibs/sensors/framework/group" mrp="os/unref/orphan/comgen/syslibs/sensors/framework/group/syslibs_sensors_framework.mrp"/>
+ </component>
+ <component name="proximitysensorssyplugin" original-name="Proximity Sensor SSY Plugin" long-name="Proximity Sensor SSY Plugin" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Sensors Services" comment="" plugin="Y" introduced="Future" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/syslibs/sensors/proximity/group" mrp="os/unref/orphan/comgen/syslibs/sensors/proximity/group/syslibs_sensors_proximity.mrp"/>
+ </component>
+ </collection>
+ <collection name="sysstatemgmt" id="systemstartup" long-name="System State Management" level="server" contribution="contributed">
+ <component name="Starter" long-name="Starter" id="Starter" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="systemstartup" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\osext\systemswextensions\systemstartup\Starter" source_size="2403586.8"/>
+ <component name="systemstarter" original-name="System Starter" long-name="System Starter" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="System State Management" comment="" introduced="9.1" deprecated="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2525010">
+ <unit bldFile="os/devicesrv/sysstatemgmt/systemstarter/group" mrp="os/devicesrv/sysstatemgmt/systemstarter/group/app-framework_sysstart.mrp"/>
+ </component>
+ <component name="systemstatemgr" original-name="System State Manager" long-name="System State Manager" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="System State Management" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes">
+ <unit bldFile="os/unref/orphan/comgen/app-framework/ssma/group" mrp="os/unref/orphan/comgen/app-framework/ssma/group/app-framework_ssma.mrp"/>
+ </component>
+ <component name="systemstateplugins" original-name="System State Plugins" long-name="System State Plugins" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="System State Management" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes">
+ <unit bldFile="os/unref/orphan/comgen/app-framework/ssplugins/group" mrp="os/unref/orphan/comgen/app-framework/ssplugins/group/app-framework_ssplugins.mrp"/>
+ </component>
+ <component name="systemstatereferenceplugins" original-name="System State Reference Plugins" long-name="System State Reference Plugins" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="System State Management" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit bldFile="os/unref/orphan/comgen/app-framework/ssrefplugins/group" mrp="os/unref/orphan/comgen/app-framework/ssrefplugins/group/app-framework_ssrefplugins.mrp"/>
+ </component>
+ </collection>
+ <collection name="resourceinterfaces" original-name="Resource Interfaces" long-name="Resource Interfaces" id="Resource Interfaces" level="hw-if" contribution="contributed">
+ <component name="fmtransmittercontrol" original-name="FM Transmitter Control" long-name="FM Transmitter Control" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Resource Interfaces" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="21400">
+ <unit bldFile="os/devicesrv/resourcemgmt/hardwareresourcesmgr/fmtx/group" mrp="os/devicesrv/resourcemgmt/hardwareresourcesmgr/fmtx/group/telephony_hwrmfmtx.mrp"/>
+ </component>
+ </collection>
+ <collection name="systemhealthmanagement" original-name="System Health Management" long-name="System Health Management" id="System Health Management" level="server" contribution="contributed">
+ <component name="systemhealthmgr" original-name="System Health Manager" long-name="System Health Manager" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="System Health Management" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit bldFile="os/unref/orphan/comgen/app-framework/shma/group" mrp="os/unref/orphan/comgen/app-framework/shma/group/app-framework_shma.mrp"/>
+ </component>
+ </collection>
+ <collection name="sensordrivers" long-name="Sensor Drivers" id="Sensor Drivers" level="adaptation" contribution="contributed">
+ <component name="proximitysensorldd" original-name="Proximity Sensor LDD" long-name="Proximity Sensor LDD" old_model="MCL" old_layer="OS Services" old_package="Device Services" old_collection="Sensor Drivers" comment="" introduced="Future" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/sensors" mrp="os/kernelhwsrv/kernel/eka/drivers/sensors/base_drivers_sensors.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Locating Services" tech_domain="lo" level="services" name="lbs" levels="hw-if data-acquisition adaptation management application-interface" contribution="contributed">
+ <collection name="datasourcemodules" original-name="Data Source Modules" long-name="Generic Positioning Plugins" id="genericpositioningplugins" level="data-acquisition" contribution="contributed">
+ <component name="LocationBTGPSPSY" long-name="BT GPS PSY" id="LocationBTGPSPSY" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="genericpositioningplugins" comment="This is the same component as Bluetooth GPS Positioning Module" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\genericpositioningplugins\LocationBTGPSPSY" source_size="1611448.8"/>
+ <component name="locationnpppsy" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="genericpositioningplugins" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\genericpositioningplugins\locationnpppsy" source_size="670597.8"/>
+ <component name="locationsuplpsy" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="genericpositioningplugins" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\genericpositioningplugins\locationsuplpsy" source_size="427674.0"/>
+ <component name="defaultpositioningmodule" original-name="Default Positioning Module" long-name="Default Positioning Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Data Source Modules" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="120572">
+ <unit bldFile="os/lbs/datasourcemodules/defaultpositioningmodule/group" mrp="os/lbs/datasourcemodules/defaultpositioningmodule/group/lbs_default_positioning_module.mrp"/>
+ </component>
+ <component name="bluetoothgpspositioningmodule" original-name="Bluetooth GPS Positioning Module" long-name="Bluetooth GPS Positioning Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Data Source Modules" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="256638">
+ <unit mrp="os/lbs/datasourcemodules/bluetoothgpspositioningmodule/group/lbs_bt_positioning_module.mrp" version="9.4" bldFile="os/lbs/datasourcemodules/bluetoothgpspositioningmodule/group"/>
+ <unit mrp="os/lbs/datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/group/lbs_bt_positioning_module.mrp" version="9.5" bldFile="os/lbs/datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/group"/>
+ <unit bldFile="os/lbs/datasourcemodules/bluetoothgpspositioningmodule/group" mrp="os/lbs/datasourcemodules/bluetoothgpspositioningmodule/group/lbs_bt_positioning_module.mrp"/>
+ </component>
+ <component name="simulationpositioningmodule" original-name="Simulation Positioning Module" long-name="Simulation Positioning Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Data Source Modules" comment="" plugin="Y" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="191512">
+ <unit bldFile="os/lbs/datasourcemodules/simulationpositioningmodule/group" mrp="os/lbs/datasourcemodules/simulationpositioningmodule/group/lbs_simulation_positioning_module.mrp"/>
+ </component>
+ <component name="agpsintegrationmodule" original-name="A-GPS Integration Module" long-name="A-GPS Integration Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Data Source Modules" comment="" plugin="Y" introduced="9.2" contribution="contributed" in_production_device_rom="no" source_size="170584">
+ <unit bldFile="os/lbs/datasourcemodules/agpsintegrationmodule/group" mrp="os/lbs/datasourcemodules/agpsintegrationmodule/group/lbs_datasourceplugins.mrp"/>
+ </component>
+ <component name="gpspositioningmodule" original-name="GPS/A-GPS Positioning Module" long-name="GPS/A-GPS Positioning Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Data Source Modules" comment="" plugin="Y" class="placeholder" introduced="9.6" contribution="contributed" in_production_device_rom="no"/>
+ <component name="networkpositioningmodule" original-name="Network Positioning Module" long-name="Network Positioning Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Data Source Modules" comment="" plugin="Y" class="placeholder" introduced="9.6" contribution="contributed" in_production_device_rom="no"/>
+ </collection>
+ <collection name="supl" id="supl" long-name="SUPL" level="adaptation" contribution="contributed">
+ <component name="locationomasuplpostester" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="supl" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\supl\locationomasuplpostester" source_size="1634025.9"/>
+ <component name="locationomasuplprotocolhandler" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="supl" comment="" contribution="excluded" copyright_holder="VTT, Celtius Ltd." license="Celtius" license_type="commercial" license_status="open" source="no" ship_license_required="mandatory" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\supl\locationomasuplprotocolhandler" source_size="9060585.0"/>
+ <component name="locationsuplfw" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="supl" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\supl\locationsuplfw" source_size="9538807.8"/>
+ </collection>
+ <collection name="datasourceadaptation" original-name="Data Source Adaptation" long-name="Data Source Adaptation" id="Data Source Adaptation" level="adaptation" contribution="contributed">
+ <component name="gpsdatasourceadaptation" original-name="GPS Data Source Adaptation" long-name="GPS Data Source Adaptation" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Data Source Adaptation" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="605652">
+ <unit bldFile="os/lbs/datasourceadaptation/gpsdatasourceadaptation/group" mrp="os/lbs/datasourceadaptation/gpsdatasourceadaptation/group/lbs_gps_data_source_adaptation.mrp"/>
+ </component>
+ </collection>
+ <collection name="locationrequestmgmt" original-name="Location Request Management" long-name="Location Request Management" id="Location Request Management" level="application-interface" contribution="contributed">
+ <component name="locationserver" original-name="Location Server" long-name="Location Server" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Location Request Management" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="NTT DoCoMo" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="NTT DoCoMo" in_production_device_rom="yes" platform_critical="no" source_size="449342">
+ <unit bldFile="os/lbs/locationrequestmgmt/locationserver/group" mrp="os/lbs/locationrequestmgmt/locationserver/group/lbs_locationserver.mrp"/>
+ </component>
+ <component name="networkrequesthandler" original-name="Network Request Handler" long-name="Network Request Handler" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Location Request Management" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="432191">
+ <unit bldFile="os/lbs/locationrequestmgmt/networkrequesthandler/group" mrp="os/lbs/locationrequestmgmt/networkrequesthandler/group/lbs_networkrequesthandler.mrp"/>
+ </component>
+ <component name="lbstestproduct" original-name="LBS Test Product" long-name="LBS Test Product" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Location Request Management" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="4293895">
+ <unit mrp="os/lbs/locationrequestmgmt/lbstestproduct/group/lbs_testproduct.mrp"/>
+ </component>
+ </collection>
+ <collection name="locationmgmt" original-name="Location Management" long-name="Location Management" id="Location Management" level="management" contribution="contributed">
+ <component name="agpslocationmgr" original-name="A-GPS Location Manager" long-name="A-GPS Location Manager" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Location Management" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="NTT DoCoMo" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="NTT DoCoMo" in_production_device_rom="yes" platform_critical="no" source_size="114539">
+ <unit bldFile="os/lbs/locationmgmt/agpslocationmgr/group" mrp="os/lbs/locationmgmt/agpslocationmgr/group/lbs_agpslocationmanager.mrp"/>
+ </component>
+ <component name="networklocationmgr" original-name="Network Location Manager" long-name="Network Location Manager" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Location Management" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="45935">
+ <unit bldFile="os/lbs/locationmgmt/networklocationmgr/group" mrp="os/lbs/locationmgmt/networklocationmgr/group/lbs_networklocationmanager.mrp"/>
+ </component>
+ <component name="locationadmin" original-name="Location Admin" long-name="Location Admin" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Location Management" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="NTT DoCoMo" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="NTT DoCoMo" in_production_device_rom="yes" platform_critical="no" source_size="4246643">
+ <unit bldFile="os/lbs/locationmgmt/locationadmin/group" mrp="os/lbs/locationmgmt/locationadmin/group/lbs_admin.mrp"/>
+ </component>
+ <component name="networkgateway" original-name="Network Gateway" long-name="Network Gateway" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Location Management" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="NTT DoCoMo" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="NTT DoCoMo" in_production_device_rom="yes" platform_critical="no" source_size="104325">
+ <unit bldFile="os/lbs/locationmgmt/networkgateway/group" mrp="os/lbs/locationmgmt/networkgateway/group/lbs_networkgateway.mrp"/>
+ </component>
+ </collection>
+ <collection name="networkprotocolmodules" original-name="Network Protocol Modules" long-name="Network Protocol Modules" id="Network Protocol Modules" level="adaptation" contribution="contributed">
+ <component name="networkprotocolmodule" original-name="Network Protocol Module" long-name="Network Protocol Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Network Protocol Modules" comment="" plugin="Y" introduced="9.2" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="593116">
+ <unit bldFile="os/lbs/networkprotocolmodules/networkprotocolmodule/group" mrp="os/lbs/networkprotocolmodules/networkprotocolmodule/group/lbs_networktest.mrp"/>
+ </component>
+ <component name="privacyprotocolmodule" original-name="Privacy Protocol Module" long-name="Privacy Protocol Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Network Protocol Modules" comment="" plugin="Y" introduced="9.5" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="NTT DoCoMo" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="NTT DoCoMo" in_production_device_rom="yes" platform_critical="no" source_size="159198">
+ <unit bldFile="os/lbs/networkprotocolmodules/privacyprotocolmodule/group" mrp="os/lbs/networkprotocolmodules/privacyprotocolmodule/group/lbs_privacyprotocolmodule.mrp"/>
+ </component>
+ <component name="suplprotocolmodule" original-name="SUPL Protocol Module" long-name="SUPL Protocol Module" old_model="MCL" old_layer="OS Services" old_package="Location Based Services" old_collection="Network Protocol Modules" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="yes" in_production_device_rom="no" platform_critical="no" source_size="3459659">
+ <unit bldFile="os/lbs/networkprotocolmodules/suplprotocolmodule/group" mrp="os/lbs/networkprotocolmodules/suplprotocolmodule/group/lbs_suplprotocolmodule.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block name="commsfw" levels="adaptation hw-if plugin framework server app-if" contribution="contributed" long-name="Communications Framework" tech_domain="dc" level="services">
+ <collection name="Comms-Infras API Tests" level="app-if" contribution="contributed">
+ <component name="Comms-Infras SVS" impl_language="os" mcl_component="Comms Infrastructure Test Product" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="os/unref/comgen/comms-infras/testproduct/group/comms-infras_testproduct.mrp"/>
+ <unit root="TCL" mrp="tools/test/suites/technology/comms-infras/group/testproduct_comms-infras.mrp"/>
+ </component>
+ </collection>
+ <collection name="commsprocessandsettings" original-name="Comms Process and Settings" long-name="Comms Process and Settings" id="Comms Process and Settings" level="server" contribution="contributed">
+ <component name="commsrootserver" original-name="Comms Root Server" long-name="Comms Root Server" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Process and Settings" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="872181">
+ <unit bldFile="os/commsfw/commsprocessandsettings/commsrootserver/group" mrp="os/commsfw/commsprocessandsettings/commsrootserver/group/comms-infras_rootserver.mrp"/>
+ </component>
+ <component name="commsrootserverconfig" original-name="Comms Root Server Config" long-name="Comms Root Server Config" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Process and Settings" comment="" class="config" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2207">
+ <unit mrp="os/commsfw/commsprocessandsettings/commsrootserver/group/comms-infras_rootserver-config.mrp"/>
+ </component>
+ </collection>
+ <collection name="commsconfigutils" original-name="Comms Config. Utils" long-name="Comms Config. Utils" id="Comms Config. Utils" level="server" contribution="contributed">
+ <component name="commsdatabase" original-name="Comms Database" long-name="Comms Database" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Config. Utils" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2984798">
+ <unit bldFile="os/commsfw/commsconfigutils/commsdatabase/group" mrp="os/commsfw/commsconfigutils/commsdatabase/group/comms-infras_commsdat.mrp"/>
+ </component>
+ <component name="commsdatabaseshim" original-name="Comms Database Shim" long-name="Comms Database Shim" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Config. Utils" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="721887">
+ <unit bldFile="os/commsfw/commsconfigutils/commsdatabaseshim/group" mrp="os/commsfw/commsconfigutils/commsdatabaseshim/group/comms-infras_commdbshim.mrp"/>
+ </component>
+ </collection>
+ <collection name="datacommsserver" original-name="Data Comms Server" long-name="Data Comms Server" id="Data Comms Server" level="framework" contribution="contributed">
+ <component name="esockserver" original-name="ESock Server" long-name="ESock Server" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Data Comms Server" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="9449962">
+ <unit version="3" bldFile="os/commsfw/datacommsserver/esockserver/group" mrp="os/commsfw/datacommsserver/esockserver/group/comms-infras_esock.mrp"/>
+ <unit mrp="os/commsfw/datacommsserver/esockserver/version2/group/comms-infras_esock.mrp" version="2" bldFile="os/commsfw/datacommsserver/esockserver/version2/group" removed="9.5"/>
+ <unit version="2" bldFile="os/commsfw/datacommsserver/esockserver/version2/group" mrp="os/commsfw/datacommsserver/esockserver/version2/group/comms-infras_esock.mrp"/>
+ </component>
+ <component name="esockserverconfig" original-name="ESock Server Config" long-name="ESock Server Config" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Data Comms Server" comment="" class="config" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="4184">
+ <unit version="3" mrp="os/commsfw/datacommsserver/esockserver/group/comms-infras_esock-config.mrp"/>
+ <unit mrp="os/commsfw/datacommsserver/esockserver/version2/group/comms-infras_esock-config.mrp" version="2" removed="9.5"/>
+ <unit version="2" mrp="os/commsfw/datacommsserver/esockserver/version2/group/comms-infras_esock-config.mrp"/>
+ </component>
+ <component name="networkinterfacemgr" original-name="Network Interface Manager" long-name="Network Interface Manager" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Data Comms Server" comment="" introduced="ER5U" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1475924">
+ <unit version="2" bldFile="os/unref/orphan/comgen/comms-infras/nifman/group" mrp="os/unref/orphan/comgen/comms-infras/nifman/group/comms-infras_nifman.mrp"/>
+ <unit mrp="os/commsfw/datacommsserver/networkinterfacemgr/group/comms-infras_nifman.mrp" version="1" bldFile="os/commsfw/datacommsserver/networkinterfacemgr/group" removed="9.5"/>
+ <unit version="1" bldFile="os/commsfw/datacommsserver/networkinterfacemgr/group" mrp="os/commsfw/datacommsserver/networkinterfacemgr/group/comms-infras_nifman.mrp"/>
+ </component>
+ <component name="networkingdialogapi" original-name="Networking Dialog API" long-name="Networking Dialog API" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Data Comms Server" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="154707">
+ <unit bldFile="os/commsfw/datacommsserver/networkingdialogapi/group" mrp="os/commsfw/datacommsserver/networkingdialogapi/group/networking_dialog.mrp"/>
+ </component>
+ <component name="networkingdialogstub" original-name="Networking Dialog Stub" long-name="Networking Dialog Stub" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Data Comms Server" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="21938">
+ <unit bldFile="os/commsfw/datacommsserver/networkingdialogapi/default" mrp="os/commsfw/datacommsserver/networkingdialogapi/default/networking_dialog_default.mrp"/>
+ </component>
+ <component name="networkcontroller" original-name="Network Controller" long-name="Network Controller" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Data Comms Server" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="490266">
+ <unit bldFile="os/commsfw/datacommsserver/networkcontroller/group" mrp="os/commsfw/datacommsserver/networkcontroller/group/networking_netcon.mrp"/>
+ </component>
+ </collection>
+ <collection name="serialserver" original-name="Serial Server" long-name="Serial Server" id="Serial Server" level="framework" contribution="contributed">
+ <component name="c32serialserver" original-name="C32 Serial Server" long-name="C32 Serial Server" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Serial Server" comment="" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1451886">
+ <unit bldFile="os/commsfw/serialserver/c32serialserver/group" mrp="os/commsfw/serialserver/c32serialserver/group/ser-comms_c32.mrp"/>
+ </component>
+ <component name="c32serialserverconfig" original-name="C32 Serial Server Config" long-name="C32 Serial Server Config" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Serial Server" comment="" class="config" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="4780">
+ <unit bldFile="os/commsfw/serialserver/c32serialserverconfig" mrp="os/commsfw/serialserver/c32serialserverconfig/ser-comms_c32-config.mrp"/>
+ </component>
+ </collection>
+ <collection name="baseconnectionproviders" original-name="Base Connection Providers" long-name="Base Connection Providers" id="Base Connection Providers" level="framework" contribution="contributed">
+ <component name="refcpr" original-name="Reference CPR" long-name="Reference CPR" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Base Connection Providers" comment="" plugin="Y" introduced="9.2" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/commsfw/baseconnectionproviders/refcpr/group/networking_ReferenceCPR.mrp" bldFile="os/commsfw/baseconnectionproviders/refcpr/group"/>
+ </component>
+ <component name="refscpr" original-name="Reference SCPR" long-name="Reference SCPR" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Base Connection Providers" comment="" plugin="Y" introduced="9.2" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/commsfw/baseconnectionproviders/refscpr/group/networking_ReferenceSCPR.mrp" bldFile="os/commsfw/baseconnectionproviders/refscpr/group"/>
+ </component>
+ </collection>
+ <collection name="commsfwutils" original-name="Comms Framework Utilities" long-name="Comms Framework Utilities" id="Comms Framework Utilities" level="framework" contribution="contributed">
+ <component name="commsfw" original-name="Comms Framework" long-name="Comms Framework" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Framework Utilities" comment="" introduced="7.0s" removed="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes">
+ <unit mrp="os/commsfw/commsfwutils/commsfw/group/comms-infras_commsfw.mrp" bldFile="os/commsfw/commsfwutils/commsfw/group" priority="10"/>
+ </component>
+ <component name="commselements" original-name="Comms Elements" long-name="Comms Elements" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Framework Utilities" comment="" introduced="8.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="6289332">
+ <unit bldFile="os/commsfw/commsfwutils/commselements/group" mrp="os/commsfw/commsfwutils/commselements/group/comms-infras_elements.mrp"/>
+ </component>
+ <component name="mbufmgr" original-name="MBuf Manager" long-name="MBuf Manager" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Framework Utilities" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="241346">
+ <unit bldFile="os/commsfw/commsfwutils/mbufmgr/group" mrp="os/commsfw/commsfwutils/mbufmgr/group/comms-infras_mbufmgr.mrp"/>
+ </component>
+ <component name="commsinfrastructuredocs" original-name="Comms Infrastructure Documentation" long-name="Comms Infrastructure Documentation" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Comms Framework Utilities" comment="" class="doc" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="3150859">
+ <unit mrp="os/commsfw/commsfwutils/commsinfrastructuredocs/comms-infras_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="serialcommsserverplugins" original-name="Serial Comms Server Plugins" long-name="Serial Comms Server Plugins" id="Serial Comms Server Plugins" level="plugin" contribution="contributed">
+ <component name="serialportcsy" original-name="Serial Port CSY" long-name="Serial Port CSY" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Serial Comms Server Plugins" comment="" plugin="Y" introduced="ER5" contribution="contributed" not_used_by_s60="" in_production_device_rom="yes" platform_critical="yes" source_size="65760">
+ <unit bldFile="os/commsfw/serialserver/c32serialserver/PORTS" mrp="os/commsfw/serialserver/c32serialserver/PORTS/ser-comms_serialportcsy.mrp"/>
+ </component>
+ <component name="packetloopbackcsy" original-name="Packet Loopback CSY" long-name="Packet Loopback CSY" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Serial Comms Server Plugins" comment="" class="test" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="91085">
+ <unit bldFile="os/commsfw/serialcommsserverplugins/packetloopbackcsy/group" mrp="os/commsfw/serialcommsserverplugins/packetloopbackcsy/group/PacketLoopbackCSY.mrp"/>
+ </component>
+ <component name="muxcsy" original-name="MUX CSY" long-name="MUX CSY" old_model="MCL" old_layer="OS Services" old_package="Communications Framework" old_collection="Serial Comms Server Plugins" comment="" plugin="Y" introduced="9.4" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="TapRoot Systems Inc; TapRoot Systems" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="TapRoot Systems Inc; TapRoot Systems" in_production_device_rom="yes" platform_critical="yes" source_size="182139">
+ <unit bldFile="os/cellularsrv/telephonyreferenceplatform/trptsy/csy/csy27010/group" mrp="os/cellularsrv/telephonyreferenceplatform/trptsy/csy/csy27010/group/telephony_muxcsy.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Networking Services" tech_domain="dc" level="services" name="networkingsrv" levels="adaptation hw-if plugin framework server app-if" contribution="contributed">
+ <collection name="commsdb" id="commsdb" long-name="Comms DB" level="server" contribution="contributed">
+ <component name="s60_commsdb" old_model="s60" old_layer="osext" old_package="networkingextensions" old_collection="commsdb" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\osext\networkingextensions\commsdb\s60_commsdb" source_size="28643.1"/>
+ </collection>
+ <collection name="esockapiextensions" original-name="ESock API Extensions" long-name="ESock API Extensions" id="ESock API Extensions" level="app-if" contribution="contributed">
+ <component name="internetsockets" original-name="Internet Sockets" long-name="Internet Sockets" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="ESock API Extensions" comment="" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="62045">
+ <unit bldFile="os/networkingsrv/esockapiextensions/internetsockets/group" mrp="os/networkingsrv/esockapiextensions/internetsockets/group/networking_insock.mrp"/>
+ </component>
+ </collection>
+ <collection name="tcpiputils" id="IP Utilities" long-name="TCP/IP Utilities" level="plugin" contribution="contributed">
+ <component name="dnd" original-name="DND" long-name="DND" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="IP Utilities" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="770189">
+ <unit bldFile="os/networkingsrv/tcpiputils/dnd/group" mrp="os/networkingsrv/tcpiputils/dnd/group/networking_dnd.mrp"/>
+ </component>
+ <component name="dndconfig" original-name="DND Config" long-name="DND Config" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="IP Utilities" comment="" class="config" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2778">
+ <unit mrp="os/networkingsrv/tcpiputils/dnd/group/networking_dnd-config.mrp"/>
+ </component>
+ <component name="dhcp" original-name="DHCP" long-name="DHCP" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="IP Utilities" comment="" introduced="8.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="935592">
+ <unit bldFile="os/networkingsrv/tcpiputils/dhcp/group" mrp="os/networkingsrv/tcpiputils/dhcp/group/networking_dhcp.mrp"/>
+ </component>
+ <component name="networkaddressandporttranslation" original-name="Network Address and Port Translation" long-name="Network Address and Port Translation" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="IP Utilities" comment="" plugin="Y" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="298546">
+ <unit bldFile="os/networkingsrv/tcpiputils/networkaddressandporttranslation/group" mrp="os/networkingsrv/tcpiputils/networkaddressandporttranslation/group/networking_napt.mrp"/>
+ </component>
+ </collection>
+ <collection name="linklayercontrol" original-name="Link Layer Control" long-name="Link Layer Control" id="Link Layer Control" level="hw-if" contribution="contributed">
+ <component name="nullagt" original-name="NULL AGT" long-name="NULL AGT" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Control" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="107941">
+ <unit bldFile="os/networkingsrv/linklayercontrol/nullagt/group" mrp="os/networkingsrv/linklayercontrol/nullagt/group/networking_nullagt.mrp"/>
+ </component>
+ <component name="genericscprparameters" original-name="Generic SCPR Parameters" long-name="Generic SCPR Parameters" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Control" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="6109">
+ <unit bldFile="os/unref/orphan/comgen/networking/umts/genericscprparams/group" mrp="os/unref/orphan/comgen/networking/umts/genericscprparams/group/networking_genericscprparams.mrp"/>
+ </component>
+ <component name="mbmsparameters" original-name="MBMS Parameters" long-name="MBMS Parameters" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Control" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="9392">
+ <unit bldFile="os/unref/orphan/comgen/networking/umts/mbmsparams/group" mrp="os/unref/orphan/comgen/networking/umts/mbmsparams/group/networking_mbmsparams.mrp"/>
+ </component>
+ </collection>
+ <collection name="linklayerprotocols" original-name="Link Layer Protocols" long-name="Link Layer Protocols" id="Link Layer Protocols" level="hw-if" contribution="contributed">
+ <component name="ethernetnif" original-name="Ethernet NIF" long-name="Ethernet NIF" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Protocols" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="923820">
+ <unit bldFile="os/networkingsrv/linklayerprotocols/ethernetnif/group" mrp="os/networkingsrv/linklayerprotocols/ethernetnif/group/networking_ether802.mrp"/>
+ </component>
+ <component name="ethernetpacketdriver" original-name="Ethernet Packet Driver" long-name="Ethernet Packet Driver" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Protocols" comment="" plugin="Y" introduced="7.0" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" partial_contribution="" license="Various OSS" in_production_device_rom="yes" platform_critical="no" source_size="968833">
+ <unit mrp="os/networkingsrv/linklayerprotocols/ethernetpacketdriver/group/networking_etherdrv_srconly.mrp"/>
+ </component>
+ <component name="pppnif" original-name="PPP NIF" long-name="PPP NIF" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Protocols" comment="" plugin="Y" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2915794">
+ <unit version="2" bldFile="os/unref/orphan/comgen/networking/ppp/group" mrp="os/unref/orphan/comgen/networking/ppp/group/networking_ppp.mrp"/>
+ <unit mrp="os/networkingsrv/linklayerprotocols/pppnif/group/networking_ppp.mrp" removed="9.5" version="1" bldFile="os/networkingsrv/linklayerprotocols/pppnif/group"/>
+ <unit version="1" bldFile="os/networkingsrv/linklayerprotocols/pppnif/group" mrp="os/networkingsrv/linklayerprotocols/pppnif/group/networking_ppp.mrp"/>
+ </component>
+ <component name="pppconfig" original-name="PPP Config" long-name="PPP Config" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Protocols" comment="" class="config" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2877">
+ <unit version="2" mrp="os/unref/orphan/comgen/networking/ppp/group/networking_ppp-config.mrp"/>
+ <unit mrp="os/networkingsrv/linklayerprotocols/pppnif/group/networking_ppp-config.mrp" removed="9.5" version="1"/>
+ <unit version="1" mrp="os/networkingsrv/linklayerprotocols/pppnif/group/networking_ppp-config.mrp"/>
+ </component>
+ <component name="slipnif" original-name="SLIP NIF" long-name="SLIP NIF" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Protocols" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="10371">
+ <unit bldFile="os/networkingsrv/linklayerprotocols/slipnif/group" mrp="os/networkingsrv/linklayerprotocols/slipnif/group/networking_slip.mrp"/>
+ </component>
+ <component name="tunnelnif" original-name="Tunnel NIF" long-name="Tunnel NIF" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Protocols" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="35119">
+ <unit bldFile="os/networkingsrv/linklayerprotocols/tunnelnif/group" mrp="os/networkingsrv/linklayerprotocols/tunnelnif/group/networking_tunnelnif.mrp"/>
+ </component>
+ </collection>
+ <collection name="linklayerutils" original-name="Link Layer Utilities" long-name="Link Layer Utilities" id="Link Layer Utilities" level="hw-if" contribution="contributed">
+ <component name="packetlogger" original-name="Packet Logger" long-name="Packet Logger" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Utilities" comment="" class="test" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="10397">
+ <unit bldFile="os/networkingsrv/linklayerutils/packetlogger/group" mrp="os/networkingsrv/linklayerutils/packetlogger/group/networking_packetlogger.mrp"/>
+ </component>
+ </collection>
+ <collection name="networkcontrol" original-name="Network Control" long-name="Network Control" id="Network Control" level="plugin" contribution="contributed">
+ <component name="qosfwconfig" original-name="QoS Framework Config" long-name="QoS Framework Config" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" class="config" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2227">
+ <unit mrp="os/networkingsrv/networkcontrol/qosfwconfig/qos/group/networking_qos-config.mrp"/>
+ </component>
+ <component name="qoslib" original-name="QoS Library" long-name="QoS Library" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="36540">
+ <unit bldFile="os/networkingsrv/networkcontrol/qoslib/group" mrp="os/networkingsrv/networkcontrol/qoslib/group/networking_qoslib.mrp"/>
+ </component>
+ <component name="pfqoslib" original-name="PF QoS Library" long-name="PF QoS Library" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="87272">
+ <unit bldFile="os/networkingsrv/networkcontrol/pfqoslib/group" mrp="os/networkingsrv/networkcontrol/pfqoslib/group/networking_pfqoslib.mrp"/>
+ </component>
+ <component name="qosfwprt" original-name="QoS Framework PRT" long-name="QoS Framework PRT" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="4019776">
+ <unit bldFile="os/networkingsrv/networkcontrol/qosfwconfig/qos/group" mrp="os/networkingsrv/networkcontrol/qosfwconfig/qos/group/networking_qos.mrp"/>
+ </component>
+ <component name="ipcpr" original-name="IP CPR" long-name="IP CPR" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" introduced="8.1" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/networkingsrv/networkcontrol/ipcpr/group/networking_ipcpr.mrp" bldFile="os/networkingsrv/networkcontrol/ipcpr/group"/>
+ </component>
+ <component name="ipscpr" original-name="IP SCPR" long-name="IP SCPR" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" introduced="9.1" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/networkingsrv/networkcontrol/ipscpr/group/networking_ipscpr.mrp" bldFile="os/networkingsrv/networkcontrol/ipscpr/group"/>
+ </component>
+ <component name="qosipscpr" original-name="QoS IP SCPR" long-name="QoS IP SCPR" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="33626">
+ <unit bldFile="os/unref/orphan/comgen/networking/umts/qosipscpr/group" mrp="os/unref/orphan/comgen/networking/umts/qosipscpr/group/networking_qosipscpr.mrp"/>
+ </component>
+ <component name="ipnetworklayer" original-name="IP Network Layer" long-name="IP Network Layer" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="107362">
+ <unit bldFile="os/unref/orphan/comgen/networking/ip/ipproto/group" mrp="os/unref/orphan/comgen/networking/ip/ipproto/group/networking_ipproto.mrp"/>
+ </component>
+ <component name="iptransportlayer" original-name="IP Transport Layer" long-name="IP Transport Layer" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="93894">
+ <unit bldFile="os/unref/orphan/comgen/networking/ip/iptransport/group" mrp="os/unref/orphan/comgen/networking/ip/iptransport/group/networking_iptransport.mrp"/>
+ </component>
+ <component name="ipcprshim" original-name="IP CPR Shim" long-name="IP CPR Shim" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" deprecated="9.6" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/networkingsrv/networkcontrol/ipcprshim/group/networking_shimcpr.mrp" bldFile="os/networkingsrv/networkcontrol/ipcprshim/group"/>
+ </component>
+ <component name="commsuserpromptmgr" original-name="Comms User Prompt Manager" long-name="Comms User Prompt Manager" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="59863">
+ <unit bldFile="os/unref/orphan/comgen/networking/ip/netups/group" mrp="os/unref/orphan/comgen/networking/ip/netups/group/networking_netups.mrp"/>
+ </component>
+ <component name="ipupsplugins" original-name="IP UPS Plugins" long-name="IP UPS Plugins" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Control" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="38004">
+ <unit bldFile="os/unref/orphan/comgen/networking/ip/ups/group" mrp="os/unref/orphan/comgen/networking/ip/ups/group/networking_ipups.mrp"/>
+ </component>
+ </collection>
+ <collection name="networkprotocols" original-name="Network Protocols" long-name="Network Protocols" id="Network Protocols" level="plugin" contribution="contributed">
+ <component id="TCP/IPv4/v6 Config" name="tcpipv4v6config" original-name="TCP/IPv4/v6 Config" long-name="TCP/IPv4/v6 Config" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Protocols" comment="" class="config" introduced="7.0" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2544">
+ <unit mrp="os/networkingsrv/networkprotocols/tcpipv4v6prt/group/networking_tcpip6-config.mrp"/>
+ </component>
+ <component name="ipeventnotifier" original-name="IP Event Notifier" long-name="IP Event Notifier" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Protocols" comment="" plugin="Y" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="389897">
+ <unit bldFile="os/networkingsrv/networkprotocols/ipeventnotifier/group" mrp="os/networkingsrv/networkprotocols/ipeventnotifier/group/networking_ipeventnotifier.mrp"/>
+ </component>
+ <component name="tcpipv4v6prt" original-name="TCP/IPv4/v6 PRT" long-name="TCP/IPv4/v6 PRT" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Protocols" comment="" plugin="Y" introduced="7.0" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1713267">
+ <unit bldFile="os/networkingsrv/networkprotocols/tcpipv4v6prt/group" mrp="os/networkingsrv/networkprotocols/tcpipv4v6prt/group/networking_tcpip6.mrp"/>
+ </component>
+ <component name="iphook" original-name="IP Hook" long-name="IP Hook" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Protocols" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="202329">
+ <unit bldFile="os/networkingsrv/networkprotocols/iphook/inhook6/group" mrp="os/networkingsrv/networkprotocols/iphook/inhook6/group/networking_inhook6.mrp"/>
+ </component>
+ <component name="mobileip" original-name="Mobile IP" long-name="Mobile IP" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Protocols" comment="" plugin="Y" introduced="8.1" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="4895">
+ <unit bldFile="os/networkingsrv/networkprotocols/mobileip/group" mrp="os/networkingsrv/networkprotocols/mobileip/group/networking_mobileip.mrp"/>
+ </component>
+ </collection>
+ <collection name="networksecurity" original-name="Network Security" long-name="Network Security" id="Network Security" level="framework" contribution="contributed">
+ <component name="tls" original-name="TLS" long-name="TLS" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Security" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="608054">
+ <unit bldFile="os/networkingsrv/networksecurity/tls/group" mrp="os/networkingsrv/networksecurity/tls/group/networking_tls.mrp"/>
+ </component>
+ <component name="tlsprovider" original-name="TLS Provider" long-name="TLS Provider" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Security" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="716969">
+ <unit bldFile="os/networkingsrv/networksecurity/tlsprovider/group" mrp="os/networkingsrv/networksecurity/tlsprovider/group/security_tlsprovider.mrp"/>
+ </component>
+ <component name="ipsec" original-name="IPsec" long-name="IPsec" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Security" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="5813333">
+ <unit bldFile="os/networkingsrv/networksecurity/ipsec/group" mrp="os/networkingsrv/networksecurity/ipsec/group/networking_ipsec.mrp"/>
+ </component>
+ </collection>
+ <collection name="networkingtestandutils" original-name="Networking Test and Utils" long-name="Networking Test and Utils" id="Networking Test and Utils" level="app-if" contribution="contributed">
+ <component name="networkingunittest" original-name="Networking Unit Test" long-name="Networking Unit Test" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" class="test" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="978537">
+ <unit mrp="os/networkingsrv/networkingtestandutils/networkingunittest/group/networking_unittest.mrp"/>
+ </component>
+ <component name="networkingrom" original-name="Networking ROM" long-name="Networking ROM" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Various Commercial" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Microsoft; OSS (unknown); BSD 2.0 (forensic); Texas Instruments" in_production_device_rom="yes" platform_critical="yes" source_size="2451811">
+ <unit bldFile="os/networkingsrv/networkingtestandutils/networkingrom/group" mrp="os/networkingsrv/networkingtestandutils/networkingrom/group/networking_general.mrp"/>
+ </component>
+ <component name="networkingexamples" original-name="Networking Examples" long-name="Networking Examples" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" class="test" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="383699">
+ <unit bldFile="os/networkingsrv/networkingtestandutils/networkingexamples/examplecode/group" mrp="os/networkingsrv/networkingtestandutils/networkingexamples/examplecode/group/networking_examplecode.mrp"/>
+ </component>
+ <component name="exampleinternetutilities" original-name="Example Internet Utilities" long-name="Example Internet Utilities" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="74742">
+ <unit mrp="os/networkingsrv/networkingtestandutils/exampleinternetutilities/group/networking_inetutil.mrp"/>
+ </component>
+ <component name="ipprobe" original-name="IP Probe" long-name="IP Probe" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="12939">
+ <unit mrp="os/networkingsrv/networkingtestandutils/ipprobe/group/networking_probe.mrp"/>
+ </component>
+ <component name="ipv6to4tunnel" original-name="IPv6 to 4 Tunnel" long-name="IPv6 to 4 Tunnel" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" plugin="Y" class="test" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="27952">
+ <unit mrp="os/networkingsrv/networkingtestandutils/ipv6to4tunnel/group/networking_6to4.mrp"/>
+ </component>
+ <component name="ipanalyzer" original-name="IP Analyzer" long-name="IP Analyzer" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" class="test" introduced="7.0" deprecated="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="49538">
+ <unit mrp="os/networkingsrv/networkingtestandutils/ipanalyzer/group/networking_iprotor.mrp"/>
+ </component>
+ <component name="networkingdocs" original-name="Networking Documentation" long-name="Networking Documentation" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1964085">
+ <unit mrp="os/networkingsrv/networkingtestandutils/networkingdocs/networking_documentation.mrp"/>
+ </component>
+ <component name="networkingintegrationtest" original-name="Networking Integration Test" long-name="Networking Integration Test" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" class="test" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="656203">
+ <unit bldFile="os/networkingsrv/networkingtestandutils/networkingintegrationtest/Group" mrp="os/networkingsrv/networkingtestandutils/networkingintegrationtest/Group/networking_integrationtest.mrp"/>
+ </component>
+ <component name="networkingperformancemeasurementtools" original-name="Networking Performance Measurement Tools" long-name="Networking Performance Measurement Tools" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Networking Test and Utils" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="577469">
+ <unit bldFile="os/unref/orphan/comgen/networking/netperf/group" mrp="os/unref/orphan/comgen/networking/netperf/group/networking_netperf.mrp"/>
+ </component>
+ </collection>
+ <collection name="pppcompressionplugins" original-name="PPP Compression Plugins" long-name="PPP Compression Plugins" id="PPP Compression Plugins" level="plugin" contribution="contributed">
+ <component name="predictorcompression" original-name="Predictor Compression" long-name="Predictor Compression" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="PPP Compression Plugins" comment="" plugin="Y" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="17105">
+ <unit bldFile="os/networkingsrv/pppcompressionplugins/predictorcompression/group" mrp="os/networkingsrv/pppcompressionplugins/predictorcompression/group/networking_predcomp.mrp"/>
+ </component>
+ <component name="mppc" original-name="MPPC" long-name="MPPC" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="PPP Compression Plugins" comment="" plugin="Y" introduced="6.0" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Hi fn" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Hi fn" in_production_device_rom="yes" platform_critical="no" source_size="24115">
+ <unit bldFile="os/networkingsrv/pppcompressionplugins/mppc/group" mrp="os/networkingsrv/pppcompressionplugins/mppc/group/networking_mscomp.mrp"/>
+ </component>
+ <component name="staclzscompression" original-name="Stac LZS Compression" long-name="Stac LZS Compression" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="PPP Compression Plugins" comment="" plugin="Y" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="52641">
+ <unit bldFile="os/networkingsrv/pppcompressionplugins/staclzscompression/group" mrp="os/networkingsrv/pppcompressionplugins/staclzscompression/group/networking_staccomp.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="WLAN" tech_domain="dc" level="services" name="wlan" levels="hw 1 mid 3 4 tools" contribution="contributed">
+ <collection name="wlan_bearer" id="wlan_bearer" long-name="WLAN Bearer" level="hw" contribution="contributed">
+ <component name="wlanpsmplugin" long-name="WLAN PSM Plugin" id="wlanpsmplugin" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="wlanutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\wlanutilities\wlanpsmplugin" source_size="110463.6"/>
+ <component name="wirelesslan" original-name="Wireless LAN" long-name="Wireless LAN" id="Wireless LAN" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Protocols" comment="" introduced="9.3" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Marvell; TapRoot Systems Inc; Various Commercial" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Marvell; TapRoot Systems Inc; TapRoot Systems; Microsoft; BSD 2.0; BSD Style" in_production_device_rom="yes" platform_critical="no" source_size="3084928">
+ <unit bldFile="os/wlan/wlan_bearer/wirelesslan/group" mrp="os/wlan/wlan_bearer/wirelesslan/group/networking_802.11.mrp"/>
+ </component>
+ <component name="wlanagent" old_model="s60" old_layer="osext" old_package="wlan" old_collection="wlan_bearer" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\osext\wlan\wlan_bearer\wlanagent" source_size="493874.4"/>
+ <component name="Wlandbif_cd" old_model="s60" old_layer="osext" old_package="wlan" old_collection="wlan_bearer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\wlan\wlan_bearer\Wlandbif_cd" source_size="111738.6"/>
+ <component name="wlanengine" old_model="s60" old_layer="osext" old_package="wlan" old_collection="wlan_bearer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\wlan\wlan_bearer\wlanengine" source_size="3568145.4"/>
+ <component name="wlanldd" old_model="s60" old_layer="osext" old_package="wlan" old_collection="wlan_bearer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\wlan\wlan_bearer\wlanldd" source_size="3147614.7"/>
+ <component name="wlannwif" old_model="s60" old_layer="osext" old_package="wlan" old_collection="wlan_bearer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\wlan\wlan_bearer\wlannwif" source_size="462963.9"/>
+ <component name="wlanpdd_ddk" old_model="s60" old_layer="osext" old_package="wlan" old_collection="wlan_bearer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\wlan\wlan_bearer\wlanpdd_ddk" source_size="5482.2"/>
+ </collection>
+ <collection name="wlantools" id="wlanasdclient" long-name="WLAN Tools" level="tools" contribution="contributed">
+ <component name="dut" old_model="s60" old_layer="tools" old_package="wlan_tools" old_collection="wlanasdclient" comment="" contribution="excluded" copyright_holder="WiFi Alliance" license="Wifi Alliance" license_type="commercial" license_status="open" source="yes" ship_license_required="open" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\wlan_tools\wlanasdclient\dut" source_size="166293.6"/>
+ <component name="ping" old_model="s60" old_layer="tools" old_package="wlan_tools" old_collection="wlanasdclient" comment="" contribution="excluded" copyright_holder="WiFi Alliance" license="Wifi Alliance" license_type="commercial" license_status="open" source="yes" ship_license_required="open" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\wlan_tools\wlanasdclient\ping" source_size="19505.1"/>
+ </collection>
+ </block>
+ <block long-name="Cellular Baseband Services" tech_domain="vc" level="services" name="cellularsrv" levels="adaptation hw-if plugin framework server app-if" contribution="contributed">
+ <collection name="commonnetworkinterface" id="commonnetworkinterface" long-name="Common Network Interface" level="hw-if" contribution="contributed">
+ <component name="gennif" old_model="s60" old_layer="osext" old_package="networkingextensions" old_collection="commonnetworkinterface" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\osext\networkingextensions\commonnetworkinterface\gennif" source_size="627526.5"/>
+ <component name="GPRSUMTSAgent" old_model="s60" old_layer="osext" old_package="networkingextensions" old_collection="commonnetworkinterface" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\osext\networkingextensions\commonnetworkinterface\GPRSUMTSAgent" source_size="29220.3"/>
+ </collection>
+ <collection name="basebandabstraction" id="intersystemcommunication" long-name="Baseband Abstraction" level="hw-if" contribution="contributed">
+ <component name="isc_if" long-name="ISC IF" id="isc_if" old_model="s60" old_layer="osext" old_package="systemswextensions" old_collection="intersystemcommunication" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" path="\s60\osext\systemswextensions\intersystemcommunication\isc_if" source_size="686136.9"/>
+ <component name="basebandchanneladaptor" original-name="Baseband Channel Adaptor" long-name="Baseband Channel Adaptor" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Baseband Abstraction" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="180002">
+ <unit bldFile="os/cellularsrv/basebandabstraction/basebandchanneladaptor/group" mrp="os/cellularsrv/basebandabstraction/basebandchanneladaptor/group/networking_bca.mrp"/>
+ </component>
+ <component name="intersystemcomm" original-name="Inter-System Communication" long-name="Inter-System Communication" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Baseband Abstraction" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="85632">
+ <unit bldFile="os/unref/orphan/comgen/networking/basebandadaptation/isc/group" mrp="os/unref/orphan/comgen/networking/basebandadaptation/isc/group/networking_isc.mrp"/>
+ </component>
+ </collection>
+ <collection name="commontsy" id="commontsy" long-name="Common TSY" level="hw-if" contribution="contributed">
+ <component name="ctsy" old_model="s60" old_layer="osext" old_package="telephonyextensions" old_collection="commontsy" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\telephonyextensions\commontsy\ctsy" source_size="3438111.0"/>
+ <component name="CustomAPI" old_model="s60" old_layer="osext" old_package="telephonyextensions" old_collection="commontsy" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\telephonyextensions\commontsy\CustomAPI" source_size="608338.2"/>
+ <component name="phonetsy" old_model="s60" old_layer="osext" old_package="telephonyextensions" old_collection="commontsy" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\telephonyextensions\commontsy\phonetsy" source_size="32884.2"/>
+ </collection>
+ <collection name="stif_tsy_test_tool" id="STIF_tsy_test_tool" long-name="STIF TSY Test Tool" level="app-if" contribution="contributed">
+ <component name="CAP" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="CC" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="Core" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="excluded" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" export_restricted="no" ship_license="No" source="yes">
+ <unit root="MCL" bldFile="os/buildtools/perltoolsplatform/perl" mrp="os/buildtools/perltoolsplatform/perl/tools_redistribution_common.mrp"/>
+ </component>
+ <component name="Eminfo" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="Notify" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="NWE" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="SEC" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="SIM" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="SMS" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="SupplementaryService" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="USSD" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="Voice" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="VoiceCore" old_model="s60" old_layer="test" old_package="rtctest" old_collection="STIF_tsy_test_tool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="dataporttesttool" id="dataporttesttool" long-name="Dataport Test Tool" level="plugin" contribution="contributed">
+ <component name="DPS_Test_client" old_model="s60" old_layer="test" old_package="rtctest" old_collection="dataporttesttool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="dps_test.dll=binary" old_model="s60" old_layer="test" old_package="rtctest" old_collection="dataporttesttool" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="basebandadaptationplugins" original-name="Baseband Adaptation Plugins" long-name="Baseband Adaptation Plugins" id="Baseband Adaptation Plugins" level="adaptation" contribution="contributed">
+ <component name="basebandchanneladaptorforc32" original-name="Baseband Channel Adaptor for C32" long-name="Baseband Channel Adaptor for C32" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Baseband Adaptation Plugins" comment="" plugin="Y" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="189419">
+ <unit bldFile="os/cellularsrv/basebandadaptationplugins/basebandchanneladaptorforc32/group" mrp="os/cellularsrv/basebandadaptationplugins/basebandchanneladaptorforc32/group/networking_c32bca.mrp"/>
+ </component>
+ <component name="basebandchanneladaptorforisc" original-name="Baseband Channel Adaptor for ISC" long-name="Baseband Channel Adaptor for ISC" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Baseband Adaptation Plugins" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit bldFile="os/cellularsrv/basebandabstraction/basebandchanneladaptortoisc/group" mrp="os/cellularsrv/basebandabstraction/basebandchanneladaptortoisc/group/networking_bcatoisc.mrp"/>
+ </component>
+ </collection>
+ <collection name="fax" original-name="Fax" long-name="Fax" id="Fax" level="server" contribution="contributed">
+ <component name="faxclientandserver" original-name="Fax Client and Server" long-name="Fax Client and Server" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Fax" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="403972">
+ <unit bldFile="os/cellularsrv/fax/faxclientandserver/Group" mrp="os/cellularsrv/fax/faxclientandserver/Group/telephony_fax.mrp"/>
+ </component>
+ </collection>
+ <collection name="smsprotocols" original-name="SMS Protocols" long-name="SMS Protocols" id="SMS Protocols" level="framework" contribution="contributed">
+ <component name="smsstack" original-name="SMS Stack" long-name="SMS Stack" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="SMS Protocols" comment="" plugin="Y" introduced="6.0" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Ericsson; Sony Ericsson Mobile Communications AB" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="Ericsson; Sony Ericsson Mobile Communications AB" in_production_device_rom="yes" platform_critical="yes" source_size="9423520">
+ <unit bldFile="os/cellularsrv/smsprotocols/smsstack/group" mrp="os/cellularsrv/smsprotocols/smsstack/group/nbprotocols_smsstackv2.mrp"/>
+ </component>
+ <component name="cdmasmsstack" original-name="CDMA SMS Stack" long-name="CDMA SMS Stack" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="SMS Protocols" comment="" plugin="Y" introduced="8.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1791930">
+ <unit bldFile="os/cellularsrv/smsprotocols/cdmasmsstack/group" mrp="os/cellularsrv/smsprotocols/cdmasmsstack/group/nbprotocols_cdmasmsstack.mrp"/>
+ </component>
+ </collection>
+ <collection name="telephonyprotocols" original-name="Telephony Protocols" long-name="Telephony Protocols" id="Telephony Protocols" level="framework" contribution="contributed">
+ <component name="csdagt" original-name="CSD AGT" long-name="CSD AGT" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="306867">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/csdagt/group" mrp="os/cellularsrv/telephonyprotocols/csdagt/group/networking_csdagt.mrp"/>
+ </component>
+ <component name="psdagt" original-name="PSD AGT" long-name="PSD AGT" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="526700">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/psdagt/group" mrp="os/cellularsrv/telephonyprotocols/psdagt/group/networking_psdagt.mrp"/>
+ </component>
+ <component name="gprsumtsqosprt" original-name="GPRS/UMTS QoS PRT" long-name="GPRS/UMTS QoS PRT" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="7.0s" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="723433">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/gprsumtsqosprt/group" mrp="os/cellularsrv/telephonyprotocols/gprsumtsqosprt/group/networking_guqos.mrp"/>
+ </component>
+ <component name="gprsumtsqosinterface" original-name="GPRS/UMTS QoS Interface" long-name="GPRS/UMTS QoS Interface" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="7.0s" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="16759">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/gprsumtsqosinterface/group" mrp="os/cellularsrv/telephonyprotocols/gprsumtsqosinterface/group/networking_umtsif.mrp"/>
+ </component>
+ <component name="qosextnapi" original-name="QoS Extn API" long-name="QoS Extn API" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="24027">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/qosextnapi/group" mrp="os/cellularsrv/telephonyprotocols/qosextnapi/group/networking_qosextnapi.mrp"/>
+ </component>
+ <component name="secondarypdpcontextumtsdriver" original-name="Secondary PDP context UMTS Driver" long-name="Secondary PDP context UMTS Driver" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1096848">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/secondarypdpcontextumtsdriver/group" mrp="os/cellularsrv/telephonyprotocols/secondarypdpcontextumtsdriver/group/networking_spud.mrp"/>
+ </component>
+ <component name="umtsgprsscpr" original-name="UMTS/GPRS SCPR" long-name="UMTS/GPRS SCPR" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="8.1" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/cellularsrv/telephonyprotocols/umtsgprsscpr/group/networking_UmtsGprsSCPR.mrp" bldFile="os/cellularsrv/telephonyprotocols/umtsgprsscpr/group"/>
+ </component>
+ <component name="qos3gppcpr" original-name="QoS 3GPP CPR" long-name="QoS 3GPP CPR" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="11063">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/qos3gppcpr/group" mrp="os/cellularsrv/telephonyprotocols/qos3gppcpr/group/networking_Qos3GPP.mrp"/>
+ </component>
+ <component name="pdplayer" original-name="PDP Layer" long-name="PDP Layer" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="132210">
+ <unit bldFile="os/unref/orphan/comgen/networking/umts/pdp/group" mrp="os/unref/orphan/comgen/networking/umts/pdp/group/networking_pdp.mrp"/>
+ </component>
+ <component name="rawipnif" original-name="Raw IP NIF" long-name="Raw IP NIF" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Protocols" comment="" plugin="Y" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="412117">
+ <unit bldFile="os/cellularsrv/telephonyprotocols/rawipnif/group" mrp="os/cellularsrv/telephonyprotocols/rawipnif/group/networking_rawipnif.mrp"/>
+ </component>
+ </collection>
+ <collection name="telephonyreferenceplatform" original-name="Telephony Reference Platform" long-name="Telephony Reference Platform" id="Telephony Reference Platform" level="plugin" contribution="contributed">
+ <component name="trptsy" original-name="TRP TSY" long-name="TRP TSY" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Reference Platform" comment="" plugin="Y" introduced="6.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="8548206">
+ <unit bldFile="os/cellularsrv/telephonyreferenceplatform/trptsy/group" mrp="os/cellularsrv/telephonyreferenceplatform/trptsy/group/telephony_trp.mrp"/>
+ </component>
+ <component name="trpagt" original-name="TRP AGT" long-name="TRP AGT" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Reference Platform" comment="" plugin="Y" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="42054">
+ <unit bldFile="os/cellularsrv/telephonyreferenceplatform/trptsy/agt/trpagt/group" mrp="os/cellularsrv/telephonyreferenceplatform/trptsy/agt/trpagt/group/telephony_trpagt.mrp"/>
+ </component>
+ </collection>
+ <collection name="telephonyserver" original-name="Telephony Server" long-name="Telephony Server" id="Telephony Server" level="server" contribution="contributed">
+ <component name="etelserverandcore" original-name="ETel Server and Core" long-name="ETel Server and Core" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2932423">
+ <unit bldFile="os/cellularsrv/telephonyserver/etelserverandcore/group" mrp="os/cellularsrv/telephonyserver/etelserverandcore/group/telephony_etel.mrp"/>
+ </component>
+ <component name="etelconfig" original-name="ETel Config" long-name="ETel Config" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server" comment="" class="config" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1016">
+ <unit mrp="os/cellularsrv/telephonyserver/etelserverandcore/group/telephony_etel-config.mrp"/>
+ </component>
+ <component name="etelmultimode" original-name="ETel Multimode" long-name="ETel Multimode" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2717256">
+ <unit bldFile="os/cellularsrv/telephonyserver/etelmultimode/group" mrp="os/cellularsrv/telephonyserver/etelmultimode/group/telephony_etelmm.mrp"/>
+ </component>
+ <component name="etelpacketdata" original-name="ETel Packet Data" long-name="ETel Packet Data" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="845080">
+ <unit bldFile="os/cellularsrv/telephonyserver/etelpacketdata/group" mrp="os/cellularsrv/telephonyserver/etelpacketdata/group/telephony_etelpckt.mrp"/>
+ </component>
+ <component name="etelsimtoolkit" original-name="ETel SIM Toolkit" long-name="ETel SIM Toolkit" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="792923">
+ <unit bldFile="os/cellularsrv/telephonyserver/etelsimtoolkit/group" mrp="os/cellularsrv/telephonyserver/etelsimtoolkit/group/telephony_etelsat.mrp"/>
+ </component>
+ <component name="etelcdma" original-name="ETel CDMA" long-name="ETel CDMA" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="511085">
+ <unit bldFile="os/cellularsrv/telephonyserver/etelcdma/group" mrp="os/cellularsrv/telephonyserver/etelcdma/group/telephony_etelcdma.mrp"/>
+ </component>
+ </collection>
+ <collection name="telephonyserverplugins" original-name="Telephony Server Plugins" long-name="Telephony Server Plugins" id="Telephony Server Plugins" level="plugin" contribution="contributed">
+ <component name="commontsy" original-name="Common TSY" long-name="Common TSY" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server Plugins" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="5043779">
+ <unit bldFile="os/unref/orphan/comgen/telephony/ctsy/group" mrp="os/unref/orphan/comgen/telephony/ctsy/group/telephony_commontsy.mrp"/>
+ </component>
+ <component name="multimodetsy" original-name="Multimode TSY" long-name="Multimode TSY" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server Plugins" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="971902">
+ <unit bldFile="os/cellularsrv/telephonyserverplugins/multimodetsy/group" mrp="os/cellularsrv/telephonyserverplugins/multimodetsy/group/telephony_mmtsy.mrp"/>
+ </component>
+ <component name="cdmatsy" original-name="CDMA TSY" long-name="CDMA TSY" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server Plugins" comment="" plugin="Y" introduced="7.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="485257">
+ <unit bldFile="os/cellularsrv/telephonyserverplugins/cdmatsy/group" mrp="os/cellularsrv/telephonyserverplugins/cdmatsy/group/telephony_cdmatsy.mrp"/>
+ </component>
+ <component name="simtsy" original-name="SIM TSY" long-name="SIM TSY" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server Plugins" comment="" plugin="Y" class="test" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1845827">
+ <unit bldFile="os/cellularsrv/telephonyserverplugins/simtsy/group" mrp="os/cellularsrv/telephonyserverplugins/simtsy/group/telephony_simtsy.mrp"/>
+ </component>
+ <component name="ctsydispatchlayer" original-name="C-TSY Dispatch Layer" long-name="C-TSY Dispatch Layer" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server Plugins" comment="" plugin="Y" class="placeholder" introduced="Future" contribution="contributed" in_production_device_rom="yes"/>
+ <component name="simatktsy" original-name="SIMATK TSY" long-name="SIMATK TSY" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Server Plugins" comment="" plugin="Y" class="placeholder test" introduced="Future" contribution="contributed" in_production_device_rom="yes"/>
+ </collection>
+ <collection name="telephonyutils" original-name="Telephony Utilities" long-name="Telephony Utilities" id="Telephony Utilities" level="app-if" contribution="contributed">
+ <component name="dial" original-name="Dial" long-name="Dial" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Utilities" comment="" deprecated="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="206242">
+ <unit bldFile="os/cellularsrv/telephonyutils/dial/group" mrp="os/cellularsrv/telephonyutils/dial/group/telephony_dial.mrp"/>
+ </component>
+ <component name="telephonywatchers" original-name="Telephony Watchers" long-name="Telephony Watchers" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Utilities" comment="" plugin="Y" introduced="6.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="174244">
+ <unit bldFile="os/cellularsrv/telephonyutils/telephonywatchers/group" mrp="os/cellularsrv/telephonyutils/telephonywatchers/group/telephony_watchers.mrp"/>
+ </component>
+ <component name="etel3rdpartyapi" original-name="ETel 3rd Party API" long-name="ETel 3rd Party API" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Utilities" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="676963">
+ <unit bldFile="os/cellularsrv/telephonyutils/etel3rdpartyapi/Group" mrp="os/cellularsrv/telephonyutils/etel3rdpartyapi/Group/telephony_etel3rdparty.mrp"/>
+ </component>
+ <component name="telephonyconfidentialdocs" original-name="Telephony Confidential Documentation" long-name="Telephony Confidential Documentation" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Utilities" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="25453">
+ <unit mrp="os/cellularsrv/telephonyutils/telephonyconfidentialdocs/telephony_confidential.mrp"/>
+ </component>
+ <component name="telephonydocs" original-name="Telephony Documentation" long-name="Telephony Documentation" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Telephony Utilities" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1164557">
+ <unit mrp="os/cellularsrv/telephonyutils/telephonydocs/telephony_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="hardwarepluginsimulation" original-name="Hardware Plugin Simulation" long-name="Hardware Plugin Simulation" id="Hardware Plugin Simulation" level="adaptation" contribution="contributed">
+ <component name="mocksy" original-name="MockSY" long-name="MockSY" old_model="MCL" old_layer="OS Services" old_package="Cellular Baseband Services" old_collection="Hardware Plugin Simulation" comment="" plugin="Y" class="placeholder" introduced="9.4" contribution="contributed" in_production_device_rom="no"/>
+ </collection>
+ </block>
+ <block name="shortlinksrv" levels="adaptation hw-if plugin framework server app-if" contribution="contributed" long-name="Short Link Services" tech_domain="de" level="services">
+ <collection name="Bluetooth API Tests" level="app-if" contribution="contributed">
+ <component name="Bluetooth SVS" impl_language="os" mcl_component="Bluetooth Test Product" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="os/unref/comgen/bluetooth/latest/testproduct/group/bluetooth_testproduct.mrp"/>
+ <unit root="TCL" mrp="tools/test/suites/technology/bluetooth/group/testproduct_bluetooth.mrp"/>
+ </component>
+ </collection>
+ <collection name="usbhardwareadaptation" original-name="USB Hardware Adaptation" long-name="USB Hardware Adaptation" id="USB Hardware Adaptation" level="adaptation" contribution="contributed">
+ <component name="omapusbhostcontrollerdriver" original-name="OMAP USB Host Controller Driver" long-name="OMAP USB Host Controller Driver" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="USB Hardware Adaptation" comment="" introduced="9.5" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Texas Instruments" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Texas Instruments" in_production_device_rom="no" platform_critical="no" source_size="60246">
+ <unit bldFile="os/boardsupport/omaph4/omaph4bsp/h4_restricted/usbho" mrp="os/boardsupport/omaph4/omaph4bsp/h4_restricted/usbho/base_omaph4hrp_usbhostotg_usbware.mrp"/>
+ </component>
+ <component name="usbhostandotgbsptemplate" original-name="OMAP USB Host Controller Driver Template" long-name="USB Host and OTG BSP Template" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="USB Hardware Adaptation" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="27698">
+ <unit bldFile="os/unref/cedgen/base/template/template_restricted/usbho" mrp="os/unref/cedgen/base/template/template_restricted/usbho/base_template_usbhostotg.mrp"/>
+ </component>
+ <component name="naviengineusbhostcontroller" original-name="NaviEngine USB Host Controller" long-name="NaviEngine USB Host Controller Driver" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="USB Hardware Adaptation" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="no">
+ <unit bldFile="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/usbho" mrp="os/unref/orphan/cedgen/base/bsp/hwip_nec_naviengine/ne1_tb_restricted/usbho/base_naviengine_usbhost.mrp"/>
+ </component>
+ </collection>
+ <collection name="usbldd" original-name="Shortlink Logical Device Drivers" long-name="Shortlink Logical Device Drivers" id="Shortlink Logical Device Drivers" level="hw-if" contribution="contributed">
+ <component name="usbclientdrivers" original-name="USB Client Driver" long-name="USB Client Drivers" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Shortlink Logical Device Drivers" comment="" introduced="8.1b" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="109902">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/usbc" mrp="os/kernelhwsrv/kernel/eka/drivers/usbc/base_e32_drivers_usbcli.mrp"/>
+ </component>
+ <component name="usbhostandotgdrivers" original-name="USB Host and OTG Drivers" long-name="USB Host and OTG Drivers" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Shortlink Logical Device Drivers" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="43092">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/usbho" mrp="os/kernelhwsrv/kernel/eka/drivers/usbho/base_drivers_usbhostotg.mrp"/>
+ </component>
+ <component name="usbhostandotgstack" original-name="USB Host and OTG Stack" long-name="USB Host and OTG Stack" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Shortlink Logical Device Drivers" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="4189169">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/usbho/usbd" mrp="os/kernelhwsrv/kernel/eka/drivers/usbho/usbd/base_drivers_usbhostotg_usbware.mrp"/>
+ </component>
+ </collection>
+ <collection name="bluetooth" original-name="Bluetooth" long-name="Bluetooth" id="Bluetooth" level="hw-if" contribution="contributed">
+ <component name="btsdp" original-name="Bluetooth SDP" long-name="Bluetooth SDP" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="182028">
+ <unit bldFile="os/shortlinksrv/bluetooth/btsdp" mrp="os/shortlinksrv/bluetooth/btsdp/bluetooth_sdp.mrp"/>
+ </component>
+ <component name="btextnotifiers" original-name="Bluetooth Notifiers Support" long-name="Bluetooth Notifiers Support" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="14590">
+ <unit bldFile="os/shortlinksrv/bluetooth/btextnotifiers" mrp="os/shortlinksrv/bluetooth/btextnotifiers/bluetooth_btextnotifiers.mrp"/>
+ </component>
+ <component name="gavdp" original-name="Bluetooth GAVDP" long-name="Bluetooth GAVDP" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="79471">
+ <unit bldFile="os/shortlinksrv/bluetooth/gavdp/group" mrp="os/shortlinksrv/bluetooth/gavdp/group/bluetooth_gavdp.mrp"/>
+ </component>
+ <component name="btexample" original-name="Bluetooth Examples and Tests" long-name="Bluetooth Examples and Tests" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth" comment="" class="test" introduced="6.1" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="977226">
+ <unit mrp="os/shortlinksrv/bluetooth/btexample/test/bluetooth_tests_examples.mrp"/>
+ </component>
+ <component name="btlogger" original-name="Bluetooth Logging Engine" long-name="Bluetooth Logging Engine" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="27766">
+ <unit bldFile="os/shortlinksrv/bluetooth/btlogger/group" mrp="os/shortlinksrv/bluetooth/btlogger/group/bluetooth_logger.mrp"/>
+ </component>
+ <component name="btdocs" original-name="Bluetooth Documentation" long-name="Bluetooth Documentation" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="2955511">
+ <unit mrp="os/shortlinksrv/bluetooth/btdocs/bluetooth_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="bluetoothmgmt" original-name="Bluetooth Management" long-name="Bluetooth Management" id="Bluetooth Management" level="framework" contribution="contributed">
+ <component name="btmgr" original-name="Bluetooth Manager" long-name="Bluetooth Manager" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth Management" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="104179">
+ <unit bldFile="os/shortlinksrv/bluetoothmgmt/btmgr" mrp="os/shortlinksrv/bluetoothmgmt/btmgr/bluetooth_manager.mrp"/>
+ </component>
+ <component name="btconfig" original-name="Bluetooth Config" long-name="Bluetooth Config" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth Management" comment="" class="config" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="5384">
+ <unit bldFile="os/shortlinksrv/bluetoothmgmt/btconfig" mrp="os/shortlinksrv/bluetoothmgmt/btconfig/bluetooth_config.mrp"/>
+ </component>
+ <component name="btrom" original-name="Bluetooth ROM" long-name="Bluetooth ROM" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth Management" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="3879">
+ <unit bldFile="os/shortlinksrv/bluetoothmgmt/btrom" mrp="os/shortlinksrv/bluetoothmgmt/btrom/bluetooth_rom.mrp"/>
+ </component>
+ <component name="bluetoothclientlib" original-name="Bluetooth Client Library" long-name="Bluetooth Client Library" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth Management" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="175535">
+ <unit bldFile="os/shortlinksrv/bluetoothmgmt/bluetoothclientlib" mrp="os/shortlinksrv/bluetoothmgmt/bluetoothclientlib/bluetooth_user.mrp"/>
+ </component>
+ <component name="btcommon" original-name="Bluetooth Build Utilities" long-name="Bluetooth Build Utilities" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth Management" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="10187">
+ <unit mrp="os/shortlinksrv/bluetoothmgmt/btcommon/bluetooth_common.mrp"/>
+ </component>
+ </collection>
+ <collection name="bluetoothcommsprofiles" original-name="Bluetooth Comms Profiles" long-name="Bluetooth Comms Profiles" id="Bluetooth Comms Profiles" level="app-if" contribution="contributed">
+ <component name="btpan" original-name="Bluetooth PAN Profile" long-name="Bluetooth PAN Profile" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Bluetooth Comms Profiles" comment="" plugin="Y" introduced="8.1" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="299911">
+ <unit bldFile="os/shortlinksrv/bluetoothcommsprofiles/btpan/group" mrp="os/shortlinksrv/bluetoothcommsprofiles/btpan/group/bluetooth_pan.mrp"/>
+ </component>
+ </collection>
+ <collection name="bthci" original-name="Host Controller Interface" long-name="Host Controller Interface" id="Host Controller Interface" level="hw-if" contribution="contributed">
+ <component name="bthci1" original-name="Bluetooth HCI Framework 1" long-name="Bluetooth HCI Framework 1" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Host Controller Interface" comment="" introduced="6.0" removed="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit mrp="os/shortlinksrv/bthci/bthci1/bluetooth_hci.mrp" bldFile="os/shortlinksrv/bthci/bthci1"/>
+ </component>
+ <component name="bthci2" original-name="Bluetooth HCI Framework 2" long-name="Bluetooth HCI Framework 2" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Host Controller Interface" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="566452">
+ <unit bldFile="os/shortlinksrv/bthci/bthci2/group" mrp="os/shortlinksrv/bthci/bthci2/group/bluetooth_hci_v2_framework.mrp"/>
+ </component>
+ <component name="hciextensioninterface" original-name="Bluetooth HCI Extension Interface" long-name="Bluetooth HCI Extension Interface" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Host Controller Interface" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="14388">
+ <unit bldFile="os/shortlinksrv/bthci/hciextensioninterface" mrp="os/shortlinksrv/bthci/hciextensioninterface/bluetooth_hciproxy.mrp"/>
+ </component>
+ <component name="hci2implementations" original-name="Bluetooth HCI 2 Reference Implementations" long-name="Bluetooth HCI 2 Reference Implementations" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Host Controller Interface" comment="" plugin="Y" introduced="9.2" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="554304">
+ <unit bldFile="os/shortlinksrv/bthci/hci2implementations/group" mrp="os/shortlinksrv/bthci/hci2implementations/group/bluetooth_hci_v2_implementations.mrp"/>
+ </component>
+ </collection>
+ <collection name="usbfunctiondrivers" original-name="USB Function Drivers" long-name="USB Function Drivers" id="USB Function Drivers" level="plugin" contribution="contributed">
+ <component name="massstoragemgr" original-name="Mass Storage Manager" long-name="Mass Storage Manager" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="USB Function Drivers" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="no" source_size="148608">
+ <unit bldFile="os/unref/orphan/comgen/connectivity/usbms/group" mrp="os/unref/orphan/comgen/connectivity/usbms/group/connectivity_usbms.mrp"/>
+ </component>
+ </collection>
+ <collection name="usbmgmt" original-name="USB Management" long-name="USB Management" id="USB Management" level="server" contribution="contributed">
+ <component name="usbmgr" original-name="USB Manager" long-name="USB Manager" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="USB Management" comment="" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Jungo" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Jungo" in_production_device_rom="yes" platform_critical="no" source_size="418860">
+ <unit version="2" bldFile="os/shortlinksrv/usbmgmt/usbmgr/group" mrp="os/shortlinksrv/usbmgmt/usbmgr/group/usb_manager.mrp"/>
+ <unit mrp="os/unref/orphan/comgen/ser-comms/usb/group/ser-comms_usb.mrp" removed="9.5" version="1" bldFile="os/unref/orphan/comgen/ser-comms/usb/group"/>
+ <unit version="2" bldFile="os/shortlinksrv/usbmgmt/usbmgr/group" mrp="os/shortlinksrv/usbmgmt/usbmgr/group/usb_manager.mrp"/>
+ </component>
+ <component name="usbmgrtests" original-name="USB Manager Tests" long-name="USB Manager Tests" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="USB Management" comment="" class="test" introduced="7.0" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Microsoft" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Microsoft" in_production_device_rom="no" platform_critical="no" source_size="1841273">
+ <unit version="2" mrp="os/shortlinksrv/usbmgmt/usbmgrtests/group/usb_test.mrp"/>
+ <unit mrp="os/unref/orphan/comgen/ser-comms/usb_test/group/ser-comms_usb_test.mrp" removed="9.5" version="1"/>
+ <unit version="2" mrp="os/shortlinksrv/usbmgmt/usbmgrtests/group/usb_test.mrp"/>
+ </component>
+ <component name="usbclassandmgrdocs" original-name="USB Class and Manager Documentation" long-name="USB Class and Manager Documentation" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="USB Management" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="8160301">
+ <unit mrp="os/shortlinksrv/usbmgmt/usbclassandmgrdocs/usb_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="shortlinkcsys" original-name="Short Link CSYs" long-name="Short Link CSYs" id="Short Link CSYs" level="adaptation" contribution="contributed">
+ <component name="btcomm" original-name="Bluetooth CSY" long-name="Bluetooth CSY" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Short Link CSYs" comment="" plugin="Y" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="54391">
+ <unit bldFile="os/shortlinksrv/shortlinkcsys/btcomm" mrp="os/shortlinksrv/shortlinkcsys/btcomm/bluetooth_btcomm.mrp"/>
+ </component>
+ </collection>
+ <collection name="infrared" original-name="Short Link Protocol Plugins" long-name="Infra Red" id="Short Link Protocol Plugins" level="plugin" contribution="contributed">
+ <component name="btstack" original-name="Bluetooth Stack" long-name="Bluetooth Stack" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Short Link Protocol Plugins" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1132466">
+ <unit bldFile="os/shortlinksrv/infrared/btstack" mrp="os/shortlinksrv/infrared/btstack/bluetooth_stack.mrp"/>
+ </component>
+ <component name="irdastack" original-name="IrDA Stack" long-name="IrDA Stack" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Short Link Protocol Plugins" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="269163">
+ <unit bldFile="os/shortlinksrv/infrared/irdastack/group" mrp="os/shortlinksrv/infrared/irdastack/group/infra-red_irda.mrp"/>
+ </component>
+ <component name="irdaconfig" original-name="IrDA Config" long-name="IrDA Config" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Short Link Protocol Plugins" comment="" class="config" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="5231">
+ <unit bldFile="os/shortlinksrv/infrared/irdaconfig" mrp="os/shortlinksrv/infrared/irdaconfig/infra-red_config.mrp"/>
+ </component>
+ <component name="irdatest" original-name="IrDA Test" long-name="IrDA Test" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Short Link Protocol Plugins" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="126210">
+ <unit mrp="os/shortlinksrv/infrared/irdatest/group/infra-red_irda_test.mrp"/>
+ </component>
+ <component name="irdadocs" original-name="IrDA Documentation" long-name="IrDA Documentation" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Short Link Protocol Plugins" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="379333">
+ <unit mrp="os/shortlinksrv/infrared/irdadocs/infra-red_documentation.mrp"/>
+ </component>
+ <component name="c32docs" original-name="Shortlink Documentation" long-name="Shortlink Documentation" old_model="MCL" old_layer="OS Services" old_package="Short Link Services" old_collection="Short Link Protocol Plugins" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="168812">
+ <unit mrp="os/shortlinksrv/infrared/c32docs/ser-comms_documentation.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block name="mm" levels="adaptation hw-if device-fw devices middleware app-if" contribution="contributed" long-name="Multimedia" tech_domain="mm" level="services">
+ <collection name="Multimedia API Tests" level="app-if" contribution="contributed">
+ <component name="Multimedia SVS" partial_contribution="yes" source="yes" license_type="commercial" license="Sun License for J2SDK (sound file soundbank.ggm); Microsoft (sound file divx_clock.avi); UIQ SDK 3.1 (various bitmaps)" comment="Some 3rd party sound files are part of the test set" impl_language="os" mcl_component="Multimedia Test Product" plugin="no" old_model="TCL" contribution="partial" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="os/unref/comgen/multimedia/testproduct/group/multimedia_testproduct.mrp"/>
+ <unit root="TCL" mrp="tools/test/suites/technology/multimedia/group/testproduct_multimedia.mrp"/>
+ </component>
+ </collection>
+ <collection name="video" id="video" long-name="Video" level="adaptation" contribution="contributed">
+ <component name="ARM_MDF_Decoders" old_model="s60" old_layer="osext" old_package="codecs" old_collection="video" comment="" contribution="excluded" copyright_holder="eMuzed Inc." license="eMuzed" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\codecs\video\ARM_MDF_Decoders" source_size="2513068.2"/>
+ </collection>
+ <collection name="audio" id="audio" long-name="Audio" level="adaptation" contribution="contributed">
+ <component name="ARM_CMMF_codecs" old_model="s60" old_layer="osext" old_package="codecs" old_collection="audio" comment="" contribution="excluded" copyright_holder="eMuzed Inc." license="eMuzed, Tim Thorpe, " license_status="no" source="no" license_type="commercial"/>
+ </collection>
+ <collection name="devsoundextensions" id="devsoundextensions" long-name="Devsound Extensions" level="hw-if" contribution="contributed">
+ <component name="AddedDevSoundControl" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\AddedDevSoundControl" source_size="36348.9"/>
+ <component name="AudioRouting" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\AudioRouting" source_size="375034.5"/>
+ <component name="ciextnfactoryplugins" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed"/>
+ <component name="DRMAudioPlayer" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\DRMAudioPlayer" source_size="527631.6"/>
+ <component name="Effects" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\Effects" source_size="3386370.6"/>
+ <component name="EffectsPresets" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\EffectsPresets" source_size="2848000.8"/>
+ <component name="GlobalAudioSettings" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\GlobalAudioSettings" source_size="115540.8"/>
+ <component name="MMExtFw" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\MMExtFw" source_size="79315.5"/>
+ <component name="MmfCustomInterfaces" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\MmfCustomInterfaces" source_size="953488.2"/>
+ <component name="MmfDevSoundServerPlatSec" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\MmfDevSoundServerPlatSec" source_size="1219047.3"/>
+ <component name="RestrictedAudioOutput" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\RestrictedAudioOutput" source_size="511968.9"/>
+ <component name="TelephonyAudioRouting" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="devsoundextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\devsoundextensions\TelephonyAudioRouting" source_size="113021.4"/>
+ </collection>
+ <collection name="mdfdevvideoextensions" id="mdfdevvideoextensions" long-name="MDF devvideo Extensions" level="hw-if" contribution="contributed">
+ <component name="ARM_MDF_Postprocessor" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="mdfdevvideoextensions" comment="" contribution="excluded" copyright_holder="eMuzed Inc." license="eMuzed" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\mdfdevvideoextensions\ARM_MDF_Postprocessor" source_size="4292739.3"/>
+ </collection>
+ <collection name="videoadaptationextensions" id="videoadaptationextensions" long-name="Video Adaptation Extensions" level="adaptation" contribution="contributed">
+ <component name="PostingSurface" old_model="s60" old_layer="osext" old_package="mmextensions" old_collection="videoadaptationextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\mmextensions\videoadaptationextensions\PostingSurface" source_size="172374.0"/>
+ </collection>
+ <collection name="imagingandcamerafws" original-name="Imaging and Camera Frameworks" long-name="Imaging and Camera Frameworks" id="Imaging and Camera Frameworks" level="app-if" contribution="contributed">
+ <component name="mmdocs" original-name="Multimedia Documentation" long-name="Multimedia Documentation" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Imaging and Camera Frameworks" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="17073509">
+ <unit mrp="os/mm/imagingandcamerafws/mmdocs/multimedia_documentation.mrp"/>
+ </component>
+ <component name="imagingfws" original-name="Imaging Frameworks" long-name="Imaging Frameworks" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Imaging and Camera Frameworks" comment="" introduced="7.0s" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Scalado AB; Various OSS" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="Scalado AB; NeuQuant OSS; LGPL 2.1 (forensic); MIT v2 (forensic); zlib libpng License (forensic)" in_production_device_rom="yes" platform_critical="yes" source_size="714167">
+ <unit bldFile="os/mm/imagingandcamerafws/imagingfws/group" mrp="os/mm/imagingandcamerafws/imagingfws/group/multimedia_icl.mrp"/>
+ </component>
+ <component name="capsadaptation" original-name="CAPS Adaptation" long-name="CAPS Adaptation" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Imaging and Camera Frameworks" comment="" class="placeholder" introduced="9.5" contribution="contributed" in_production_device_rom="yes"/>
+ <component name="imagingunittests" original-name="Imaging Unit Tests" long-name="Imaging Unit Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Imaging and Camera Frameworks" comment="" class="test" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="34977747">
+ <unit mrp="os/mm/imagingandcamerafws/imagingunittests/group/multimedia_unittest_icl_source.mrp"/>
+ </component>
+ <component name="imaginginttests" original-name="Imaging Integration Tests" long-name="Imaging Integration Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Imaging and Camera Frameworks" comment="" class="test" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="103774713">
+ <unit mrp="os/mm/imagingandcamerafws/imaginginttests/group/multimedia_inttest_icl_source.mrp"/>
+ </component>
+ <component name="camerafw" original-name="Camera Framework" long-name="Camera Framework" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Imaging and Camera Frameworks" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="230112">
+ <unit bldFile="os/mm/imagingandcamerafws/camerafw/framework/group" mrp="os/mm/imagingandcamerafws/camerafw/framework/group/multimedia_ecam_framework.mrp"/>
+ </component>
+ <component name="cameraunittests" original-name="Camera Unit Tests" long-name="Camera Unit Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Imaging and Camera Frameworks" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="100644">
+ <unit mrp="os/mm/imagingandcamerafws/cameraunittests/group/multimedia_unittest_ecam_source.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmresourcemgmt" original-name="Multimedia Resource Management" long-name="Multimedia Resource Management" id="Multimedia Resource Management" level="middleware" contribution="contributed">
+ <component name="mmresourcecontroller" original-name="Multimedia Resource Controller" long-name="Multimedia Resource Controller" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Resource Management" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="51531">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/refmmrc/group" mrp="os/unref/orphan/comgen/multimedia/a3f/refmmrc/group/multimedia_a3f_refmmrc.mrp"/>
+ </component>
+ <component name="decisionfw" original-name="Decision Framework" long-name="Decision Framework" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Resource Management" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/mmrc/mmrcfw/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/mmrc/mmrcfw/group/multimedia_mmrcfw.mrp"/>
+ </component>
+ <component name="mmmgmtengine" original-name="Multimedia Management Engine" long-name="Multimedia Management Engine" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Resource Management" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/management/mgtengine/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/management/mgtengine/group/multimedia_mgtengine.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmplugins" original-name="Multimedia Plugins" long-name="Multimedia Plugins" id="Multimedia Plugins" level="middleware" contribution="contributed">
+ <component name="imagingplugins" original-name="Imaging Plugins" long-name="Imaging Plugins" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Plugins" comment="" plugin="Y" introduced="7.0s" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" partial_contribution="yes" license="JPEG License; Free Software License" in_production_device_rom="yes" platform_critical="no" source_size="2354925">
+ <unit bldFile="os/mm/imagingandcamerafws/imagingfws/plugins/group" mrp="os/mm/imagingandcamerafws/imagingfws/plugins/group/multimedia_icl_plugin.mrp"/>
+ </component>
+ <component name="cameraplugins" original-name="Camera Plugins" long-name="Camera Plugins" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Plugins" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="33196">
+ <unit bldFile="os/mm/imagingandcamerafws/camerafw/plugins/group" mrp="os/mm/imagingandcamerafws/camerafw/plugins/group/multimedia_ecam_plugins.mrp"/>
+ </component>
+ <component name="3gplib" original-name="3GP Library" long-name="3GP Library" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Plugins" comment="" introduced="9.6" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/3gplibrary/group" mrp="os/unref/orphan/comgen/multimedia/3gplibrary/group/multimedia_3gplibrary.mrp"/>
+ </component>
+ <component name="3gpunittests" original-name="3GP Unit Tests" long-name="3GP Unit Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Plugins" comment="" class="test" introduced="9.6" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit mrp="os/unref/orphan/comgen/multimedia/unittest/3gplibrary/group/multimedia_unittest_3gplibrary_source.mrp"/>
+ </component>
+ <component name="mmtestcodecs" original-name="Multimedia Test Codecs" long-name="Multimedia Test Codecs" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Plugins" comment="" plugin="Y" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="3506006">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/packetvideo/group" mrp="os/unref/orphan/comgen/multimedia/packetvideo/group/multimedia_pv_aac.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmdevicefw" original-name="Multimedia Device Framework" long-name="Multimedia Device Framework" id="Multimedia Device Framework" level="device-fw" contribution="contributed">
+ <component name="mediadevicefw" original-name="Media Device Framework" long-name="Media Device Framework" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Device Framework" comment="" introduced="9.2" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Packet Video" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Packet Video" in_production_device_rom="yes" platform_critical="yes" source_size="144788">
+ <unit bldFile="os/mm/mmdevicefw/mediadevicefw/group" mrp="os/mm/mmdevicefw/mediadevicefw/group/multimedia_mdf.mrp"/>
+ </component>
+ <component name="mediadevicefw2" original-name="Media Device Framework 2" long-name="Media Device Framework 2" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Device Framework" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-infras/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-infras/group/multimedia_mm-infras.mrp"/>
+ </component>
+ <component name="mdfunittests" original-name="MDF Unit Tests" long-name="MDF Unit Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Device Framework" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1289441">
+ <unit mrp="os/mm/mmdevicefw/mdfunittests/group/multimedia_unittest_mdf_source.mrp"/>
+ </component>
+ <component name="speechrecognitioncontroller" original-name="Speech Recognition Controller" long-name="Speech Recognition Controller" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Device Framework" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="56235">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/ASR/group" mrp="mw/mmmw/mmmiddlewarefws/mmfw/ASR/group/multimedia_mmf_ASR.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmswadaptation" original-name="Multimedia Software Adaptation" long-name="Multimedia Software Adaptation" id="Multimedia Software Adaptation" level="adaptation" contribution="contributed">
+ <component name="videorenderer" original-name="Video Renderer" long-name="Video Renderer" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Software Adaptation" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="33043">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/videorenderer/group" mrp="mw/mmmw/mmmiddlewarefws/mmfw/videorenderer/group/multimedia_videorenderer.mrp"/>
+ </component>
+ </collection>
+ <collection name="openmaxil" original-name="OpenMAX IL" long-name="OpenMAX IL" id="OpenMAX IL" level="hw-if" contribution="contributed">
+ <component name="openmax" original-name="OpenMAX" long-name="OpenMAX" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" introduced="9.4" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="os/mm/openmaxil/openmax/group/multimedia_openmax.mrp" bldFile="os/mm/openmaxil/openmax/group"/>
+ </component>
+ <component name="openmaxilapi" original-name="OpenMAX IL API" long-name="OpenMAX IL API" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" introduced="9.5" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="LGPL" license_status="Open" ship_license="No" source="yes" partial_contribution="" license="LGPL" in_production_device_rom="yes" platform_critical="no" source_size="70989">
+ <unit version="1" bldFile="os/mm/openmaxil/openmax/il/omxilapi/group" mrp="os/mm/openmaxil/openmax/il/omxilapi/group/multimedia_omx_il_api.mrp"/>
+ <unit version="2" bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-il-adapt/il/omxilapi/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-il-adapt/il/omxilapi/group/multimedia_omx_il_api.mrp"/>
+ </component>
+ <component name="openmaxilcore" original-name="OpenMAX IL Core" long-name="OpenMAX IL Core" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="48475">
+ <unit version="1" bldFile="os/mm/openmaxil/openmax/il/omxilcore/group" mrp="os/mm/openmaxil/openmax/il/omxilcore/group/multimedia_omx_il_core.mrp"/>
+ <unit version="2" bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-il-adapt/il/omxilcore/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-il-adapt/il/omxilcore/group/multimedia_omx_il_core.mrp"/>
+ </component>
+ <component name="openmaxilcomponentfw" original-name="OpenMAX IL Component Framework" long-name="OpenMAX IL Component Framework" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="no">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-il-adapt/il/omxilcomp/components/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-il-adapt/il/omxilcomp/components/group/multimedia_omx_il_comp.mrp"/>
+ </component>
+ <component name="openmaxilreferencecomponents" original-name="OpenMAX IL Reference Components" long-name="OpenMAX IL Reference Components" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="96910">
+ <unit version="1" bldFile="os/mm/openmaxil/openmax/il/omxilcomp/ref_components/group" mrp="os/mm/openmaxil/openmax/il/omxilcomp/ref_components/group/multimedia_omx_il_comp_ref.mrp"/>
+ <unit version="2" bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/data/group_omx_ref_components" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/data/group_omx_ref_components/multimedia_omx_il_comp_ref.mrp"/>
+ </component>
+ <component name="openmaxiltestcomponents" original-name="OpenMAX IL Test Components" long-name="OpenMAX IL Test Components" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="27302">
+ <unit bldFile="os/mm/openmaxil/openmax/il/omxilcomp/test_components/group" mrp="os/mm/openmaxil/openmax/il/omxilcomp/test_components/group/multimedia_omx_il_comp_test.mrp"/>
+ </component>
+ <component name="openmaxilunittests" original-name="OpenMAX IL Unit Tests" long-name="OpenMAX IL Unit Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="366209">
+ <unit mrp="os/unref/orphan/comgen/multimedia/unittest/openmax/il/group/multimedia_unittest_omx_il.mrp"/>
+ </component>
+ <component name="openmaxilcoreconformancesuite" original-name="OpenMAX IL Core Conformance Suite" long-name="OpenMAX IL Core Conformance Suite" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="72083">
+ <unit mrp="os/unref/orphan/comgen/multimedia/confsuite/omxil/core_loader_conf_suite/group/multimedia_omx_il_core_loader_conf_suite.mrp"/>
+ </component>
+ <component name="mmintegrationlayerapi" original-name="Multimedia Integration Layer API" long-name="Multimedia Integration Layer API" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" in_production_device_rom="no" platform_critical="no" source_size="56709">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/milif/refomxil/group" mrp="os/unref/orphan/comgen/multimedia/milif/refomxil/group/multimedia_il_api.mrp"/>
+ </component>
+ <component name="mmintegrationlayerunittests" original-name="Multimedia Integration Layer Unit Tests" long-name="Multimedia Integration Layer Unit Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="OpenMAX IL" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="56815">
+ <unit mrp="os/unref/orphan/comgen/multimedia/unittest/milif/group/multimedia_unittest_milif.mrp"/>
+ </component>
+ </collection>
+ <collection name="sounddevice" original-name="Sound Device" long-name="Sound Device" id="Sound Device" level="devices" contribution="contributed">
+ <component name="devsoundapi" original-name="DevSound API" long-name="DevSound API" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="28683">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_api" mrp="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_api/multimedia_mdf_devsound_api.mrp"/>
+ </component>
+ <component name="a3fdevsound" original-name="A3F DevSound" long-name="A3F DevSound" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="185830">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/a3fdevsound/group" mrp="os/unref/orphan/comgen/multimedia/a3f/a3fdevsound/group/multimedia_a3f_devsound.mrp"/>
+ </component>
+ <component name="a3faudiocomponentfw" original-name="A3F Audio Component Framework" long-name="A3F Audio Component Framework" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="35902">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/acf/group" mrp="os/unref/orphan/comgen/multimedia/a3f/acf/group/multimedia_a3f_acf.mrp"/>
+ </component>
+ <component name="devsoundpluginsupport" original-name="DevSound Plugin Support" long-name="DevSound Plugin Support" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="155471">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_pluginsupport" mrp="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_pluginsupport/multimedia_mdf_devsound_pluginsupport.mrp"/>
+ </component>
+ <component name="referencedevsoundplugins" original-name="Reference DevSound Plugins" long-name="Reference DevSound Plugins" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="249948">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_refplugin" mrp="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_refplugin/multimedia_mdf_devsound_refplugin.mrp"/>
+ </component>
+ <component name="bluetoothdevsoundplugin" original-name="Bluetooth DevSound Plugin" long-name="Bluetooth DevSound Plugin" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="313895">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/sounddevbt/group" mrp="mw/mmmw/mmmiddlewarefws/mmfw/sounddevbt/group/multimedia_mdf_devsound_refbtplugin.mrp"/>
+ </component>
+ <component name="a3ftraceutility" original-name="A3F Trace Utility" long-name="A3F Trace Utility" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="12958">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/traces/group" mrp="os/unref/orphan/comgen/multimedia/a3f/traces/group/multimedia_a3f_traces.mrp"/>
+ </component>
+ <component name="a3fintegrationtests" original-name="A3F Integration Tests" long-name="A3F Integration Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="66690824">
+ <unit mrp="os/unref/orphan/comgen/multimedia/inttest/a3f/devsound/group/multimedia_inttest_a3f_devsound_source.mrp"/>
+ </component>
+ <component name="a3fserverstart" original-name="A3F Server Start" long-name="A3F Server Start" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Sound Device" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="3748">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/a3fserverstart/group" mrp="os/unref/orphan/comgen/multimedia/a3f/a3fserverstart/group/multimedia_a3f_serverstart.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmhais" original-name="Multimedia Hardware Adaptation Interfaces" long-name="Multimedia Hardware Adaptation Interfaces" id="Multimedia Hardware Adaptation Interfaces" level="adaptation" contribution="contributed">
+ <component name="devsoundhardwaredeviceapi" original-name="DevSound Hardware Device API" long-name="DevSound Hardware Device API" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Hardware Adaptation Interfaces" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="9087">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_hwdev" mrp="mw/mmmw/mmmiddlewarefws/mmfw/SoundDev/group_hwdev/multimedia_mdf_devsound_hwdev.mrp"/>
+ </component>
+ <component name="a3faudiocomponentlib" original-name="A3F Audio Component Library" long-name="A3F Audio Component Library" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Hardware Adaptation Interfaces" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="54295">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/acl/group" mrp="os/unref/orphan/comgen/multimedia/a3f/acl/group/multimedia_a3f_acl.mrp"/>
+ </component>
+ <component name="a3fdevsoundcustomisation" original-name="A3F DevSound Customisation" long-name="A3F DevSound Customisation" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Hardware Adaptation Interfaces" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="14656">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/devsoundadaptationinfo/group" mrp="os/unref/orphan/comgen/multimedia/a3f/devsoundadaptationinfo/group/multimedia_a3f_devsoundadaptationinfo.mrp"/>
+ </component>
+ <component name="referenceacladaptation" original-name="Reference ACL Adaptation" long-name="Reference ACL Adaptation" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Hardware Adaptation Interfaces" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="123559">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/a3f/refacladaptation/group" mrp="os/unref/orphan/comgen/multimedia/a3f/refacladaptation/group/multimedia_a3f_refacladaptation.mrp"/>
+ </component>
+ <component name="videohai" original-name="Video HAI" long-name="Video HAI" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Hardware Adaptation Interfaces" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="141825">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/DevVideo/group" mrp="mw/mmmw/mmmiddlewarefws/mmfw/DevVideo/group/multimedia_mdf_devvideo.mrp"/>
+ </component>
+ <component name="dvbhreceiverhai" original-name="Mobile TV DVB-H Receiver HAI" long-name="Mobile TV DVB-H Receiver HAI" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Hardware Adaptation Interfaces" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="29261">
+ <unit bldFile="os/mm/mmhais/dvbhreceiverhai/hai/dvbh/group" mrp="os/mm/mmhais/dvbhreceiverhai/hai/dvbh/group/multimedia_mobiletv_dvbh_hai.mrp"/>
+ </component>
+ <component name="dvbhunittests" original-name="Mobile TV DVB-H Unit Tests" long-name="Mobile TV DVB-H Unit Tests" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Hardware Adaptation Interfaces" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="23973">
+ <unit mrp="os/mm/mmhais/dvbhunittests/hai/dvbh/group/multimedia_unittest_dvbhhai.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmhostprocess" original-name="Multimedia Host Process" long-name="Multimedia Host Process" id="Multimedia Host Process" level="devices" contribution="contributed">
+ <component name="mmhpvideoclient" original-name="MMHP Video Client" long-name="MMHP Video Client" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Host Process" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/client/video/mmvideocomponents/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/client/video/mmvideocomponents/group/multimedia_mmhp_video_client.mrp"/>
+ </component>
+ <component name="mmhpaudioclient" original-name="MMHP Audio Client" long-name="MMHP Audio Client" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Host Process" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/client/audio/mmaudiocomponents/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/client/audio/mmaudiocomponents/group/multimedia_mmhp_audio_client.mrp"/>
+ </component>
+ <component name="mmhpcameraclient" original-name="MMHP Camera Client" long-name="MMHP Camera Client" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Host Process" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/client/camera/mmcameracomponents/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/client/camera/mmcameracomponents/group/multimedia_mmhp_camera_client.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmdataplaneadaptation" original-name="Multimedia Data Plane Adaptation" long-name="Multimedia Data Plane Adaptation" id="Multimedia Data Plane Adaptation" level="hw-if" contribution="contributed">
+ <component name="openmaxildataplanenodes" original-name="OpenMAX IL Data Plane Nodes" long-name="OpenMAX IL Data Plane Nodes" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Data Plane Adaptation" comment="" plugin="Y" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/omxilcomponents/group" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/omxilcomponents/group/multimedia_data_plane_nodes.mrp"/>
+ </component>
+ <component name="openmaxiltranslators" original-name="OpenMAX IL Translators" long-name="OpenMAX IL Translators" old_model="MCL" old_layer="OS Services" old_package="Multimedia" old_collection="Multimedia Data Plane Adaptation" comment="" plugin="Y" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/data/group_translators" mrp="os/unref/orphan/comgen/multimedia/mm3plane/mm-tech/data/group_translators/multimedia_openmax_il_translators.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Imaging Extensions" tech_domain="mm" level="services" name="imagingext" levels="adaptation hw-if plugin framework server app-if" contribution="contributed">
+ <collection name="imageadaptationextensions" id="imageadaptationextensions" long-name="Image Adaptation Extensions" level="app-if" contribution="contributed">
+ <component name="IclExtJpegApi" old_model="s60" old_layer="osext" old_package="imagingextensions" old_collection="imageadaptationextensions" comment="To be moved back into multimedia" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\imagingextensions\imageadaptationextensions\IclExtJpegApi" source_size="686226.0"/>
+ </collection>
+ <collection name="imagingmodules" id="imagingmodules" long-name="Imaging Modules" level="hw-if" contribution="contributed">
+ <component name="ExifLib" old_model="s60" old_layer="osext" old_package="imagingextensions" old_collection="imagingmodules" comment="To be moved back into multimedia" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\imagingextensions\imagingmodules\ExifLib" source_size="5086005.6"/>
+ <component name="H264AVCVideoEncARM" old_model="s60" old_layer="osext" old_package="imagingextensions" old_collection="imagingmodules" comment="To be moved back into multimedia" contribution="excluded" copyright_holder="eMuzed Inc." license="eMuzed" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\imagingextensions\imagingmodules\H264AVCVideoEncARM" source_size="6429274.2"/>
+ <component name="JP2KCodec" old_model="s60" old_layer="osext" old_package="imagingextensions" old_collection="imagingmodules" comment="To be moved back into multimedia" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\imagingextensions\imagingmodules\JP2KCodec" source_size="1016149.2"/>
+ <component name="VideoEncPluginARM" old_model="s60" old_layer="osext" old_package="imagingextensions" old_collection="imagingmodules" comment="To be moved back into multimedia" contribution="excluded" copyright_holder="eMuzed Inc." license="eMuzed" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\imagingextensions\imagingmodules\VideoEncPluginARM" source_size="1215259.8"/>
+ </collection>
+ </block>
+ <block name="graphics" levels="adaptation engines internal-adaptations device-interface internal-utils app-if" contribution="contributed" long-name="Graphics" tech_domain="ui" level="services">
+ <collection name="Graphics API Tests" level="app-if" contribution="contributed">
+ <component name="Graphics SVS" impl_language="os" mcl_component="Graphics Test Product" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="os/unref/comgen/graphics/testproduct/group/graphics_testproduct.mrp"/>
+ <unit root="TCL" mrp="tools/test/suites/technology/graphics/group/testproduct_graphics.mrp"/>
+ </component>
+ </collection>
+ <collection name="m3g" level="internal-adaptations" contribution="contributed">
+ <component name="m3gapi" long-name="M3G API" id="m3gapi" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\m3gapi" source_size="1287235.2"/>
+ <component name="M3GCore11" long-name="M3G Core11" id="M3GCore11" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\M3GCore11" source_size="489204.6"/>
+ </collection>
+ <collection name="graphicsaccelaration" id="graphicsaccelaration" long-name="Graphics Accelaration" level="adaptation" contribution="excluded" copyright_holder="The Khronos Group" license="Khronos" license_type="commercial" license_status="no" source="yes" ship_license_required="open">
+ <component name="2D_OpenVG_1_0" old_model="s60" old_layer="osext" old_package="graphicsadaptations" old_collection="graphicsaccelaration" comment="" contribution="excluded" copyright_holder="The Khronos Group" license="Khronos" license_type="commercial" license_status="no" source="yes" ship_license_required="open" in_production_device_rom="" platform_critical="" not_used_by_s60="yes" path="\s60\osext\graphicsadaptations\graphicsaccelaration\2D_OpenVG_1_0" source_size="844910.1"/>
+ <component name="3d_opengl_es_1_1" old_model="s60" old_layer="osext" old_package="graphicsadaptations" old_collection="graphicsaccelaration" comment="Currently a special contract with Hybrid." contribution="excluded" copyright_holder="Nokia, Hybrid, The Khronos Group" license="Hybrid, Khronos" license_type="commercial" license_status="no" source="yes" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\graphicsadaptations\graphicsaccelaration\3d_opengl_es_1_1" source_size="896106.6"/>
+ </collection>
+ <collection name="graphicsresourceservices" original-name="Graphics Resource Services" long-name="Graphics Resource Services" id="Graphics Resource Services" level="engines" contribution="contributed">
+ <component name="graphicsresource" original-name="Graphics Resource" long-name="Graphics Resource" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Resource Services" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="468969">
+ <unit bldFile="os/unref/orphan/comgen/graphics/graphicsresource/group" mrp="os/unref/orphan/comgen/graphics/graphicsresource/group/graphics_graphicsresource.mrp"/>
+ </component>
+ <component name="graphicsresourceadaptation" original-name="Graphics Resource Adaptation" long-name="Graphics Resource Adaptation" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Resource Services" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="26814">
+ <unit bldFile="os/unref/orphan/comgen/graphics/graphicsresourceadapter/group" mrp="os/unref/orphan/comgen/graphics/graphicsresourceadapter/group/graphics_graphicsresourceadapter.mrp"/>
+ </component>
+ </collection>
+ <collection name="graphicsutils" original-name="Graphics Utils" long-name="Graphics Utils" id="Graphics Utils" level="engines" contribution="contributed">
+ <component name="commongraphicsheaders" original-name="Common Graphics Headers" long-name="Common Graphics Headers" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Utils" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="3752">
+ <unit bldFile="os/unref/orphan/comgen/graphics/commonheader/group" mrp="os/unref/orphan/comgen/graphics/commonheader/group/graphics_commonheader.mrp"/>
+ </component>
+ </collection>
+ <collection name="graphicshardwaredrivers" original-name="Graphics Hardware Drivers" long-name="Graphics Hardware Drivers" id="Graphics Hardware Drivers" level="adaptation" contribution="contributed">
+ <component name="displaydrivers" original-name="Display Driver" long-name="Display Drivers" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Hardware Drivers" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/display" mrp="os/kernelhwsrv/kernel/eka/drivers/display/base_e32_drivers_display.mrp"/>
+ </component>
+ <component name="surfacemgr" original-name="Surface Manager" long-name="Surface Manager" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Hardware Drivers" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="173150">
+ <unit bldFile="os/unref/orphan/comgen/graphics/surfacemanager/group" mrp="os/unref/orphan/comgen/graphics/surfacemanager/group/graphics_surfacemanager.mrp"/>
+ </component>
+ </collection>
+ <collection name="graphicscomposition" original-name="Graphics Composition" long-name="Graphics Composition" id="Graphics Composition" level="engines" contribution="contributed">
+ <component name="graphicscompositionengine" original-name="Graphics Composition Engine" long-name="Graphics Composition Engine" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Composition" comment="" introduced="9.5" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Hybrid Graphics; Hybrid Graphics" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Hybrid Graphics; Hybrid Graphics" in_production_device_rom="yes" platform_critical="no" source_size="3123552">
+ <unit bldFile="os/unref/orphan/comgen/graphics/gce/group" mrp="os/unref/orphan/comgen/graphics/gce/group/graphics_gce.mrp"/>
+ </component>
+ <component name="compositionengineadaptation" original-name="Composition Engine Adaptation" long-name="Composition Engine Adaptation" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Composition" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="157037">
+ <unit bldFile="os/unref/orphan/comgen/graphics/gce/compositionbackend/group" mrp="os/unref/orphan/comgen/graphics/gce/compositionbackend/group/graphics_compositionbackend.mrp"/>
+ </component>
+ <component name="surfaceupdate" original-name="Surface Update" long-name="Surface Update" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Composition" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="109499">
+ <unit bldFile="os/unref/orphan/comgen/graphics/surfaceupdate/group" mrp="os/unref/orphan/comgen/graphics/surfaceupdate/group/graphics_surfaceupdate.mrp"/>
+ </component>
+ </collection>
+ <collection name="graphicstest" original-name="Graphics Test" long-name="Graphics Test" id="Graphics Test" level="app-if" contribution="contributed">
+ <component name="graphicstestharness" original-name="Graphics Test Harness" long-name="Graphics Test Harness" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Test" comment="" class="test" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="28043">
+ <unit mrp="os/graphics/graphicstest/graphicstestharness/group/graphics_testharness.mrp"/>
+ </component>
+ <component name="uibench" original-name="UI Bench" long-name="UI Bench" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Test" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="2134405">
+ <unit bldFile="os/graphics/graphicstest/uibench/group" mrp="os/graphics/graphicstest/uibench/group/graphics_ui_bench.mrp"/>
+ </component>
+ <component name="graphicsdocs" original-name="Graphics Documentation" long-name="Graphics Documentation" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Test" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="2637263">
+ <unit mrp="os/graphics/graphicstest/graphicsdocs/graphics_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="windowing" original-name="Windowing" long-name="Windowing" id="Windowing" level="app-if" contribution="contributed">
+ <component name="windowserver" original-name="Window Server" long-name="Window Server" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Windowing" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="10961428">
+ <unit bldFile="os/graphics/windowing/windowserver/group" mrp="os/graphics/windowing/windowserver/group/graphics_wserv.mrp"/>
+ </component>
+ <component name="windowserverplugins" original-name="Window Server Plugins" long-name="Window Server Plugins" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Windowing" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/graphics/windowing/windowserver_std_plugins/group" mrp="os/graphics/windowing/windowserver_std_plugins/group/graphics_wserv_std_plugins.mrp"/>
+ </component>
+ </collection>
+ <collection name="printingservices" original-name="Printing Services" long-name="Printing Services" id="Printing Services" level="app-if" contribution="contributed">
+ <component name="printerdriversupport" original-name="Printer Driver Support" long-name="Printer Driver Support" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Printing Services" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="123153">
+ <unit bldFile="os/graphics/printingservices/printerdriversupport/group" mrp="os/graphics/printingservices/printerdriversupport/group/graphics_pdrstore.mrp"/>
+ </component>
+ <component name="printerdrivers" original-name="Printer Drivers" long-name="Printer Drivers" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Printing Services" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="51781">
+ <unit bldFile="os/graphics/printingservices/printerdrivers/group" mrp="os/graphics/printingservices/printerdrivers/group/graphics_printdrv.mrp"/>
+ </component>
+ </collection>
+ <collection name="fbs" level="device-interface" contribution="contributed">
+ <component name="fontandbitmapserver" original-name="Font and Bitmap Server" long-name="Font and Bitmap Server" id="Font and Bitmap Server" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Fonts Services" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="2870405">
+ <unit bldFile="os/graphics/fbs/fontandbitmapserver/group" mrp="os/graphics/fbs/fontandbitmapserver/group/graphics_fbserv.mrp"/>
+ </component>
+ <component name="itypefontrasteriser" original-name="iType Font Rasteriser" long-name="iType Font Rasteriser" id="iType Font Rasteriser" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Fonts Services" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1182292">
+ <unit bldFile="os/graphics/fbs/itypefontrasteriser/group" mrp="os/graphics/fbs/itypefontrasteriser/group/graphics_itype.mrp"/>
+ </component>
+ </collection>
+ <collection name="opengles" original-name="OpenGLES" long-name="OpenGLES" id="OpenGLES" level="internal-adaptations" contribution="contributed">
+ <component name="openglesinterface" original-name="OpenGLES Interface" long-name="OpenGLES Interface" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="OpenGLES" comment="" introduced="8.0" contribution="contributed" in_production_device_rom="yes" source_size="181336">
+ <unit bldFile="os/graphics/opengles/openglesinterface/group" mrp="os/graphics/opengles/openglesinterface/group/graphics_openglesheaders.mrp"/>
+ </component>
+ <component name="openglesimplementation" original-name="OpenGL ES Implementation" long-name="OpenGL ES Implementation" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="OpenGLES" comment="" introduced="8.0" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Silicon Graphics; Hybrid Graphics" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Silicon Graphics; Hybrid Graphics" in_production_device_rom="no" platform_critical="no" source_size="699869">
+ <unit bldFile="os/graphics/opengles/openglesimplementation/group/" mrp="os/graphics/opengles/openglesimplementation/group/graphics_opengles.mrp"/>
+ </component>
+ <component name="openglesdisplayproperties" original-name="OpenGLES Display Properties" long-name="OpenGLES Display Properties" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="OpenGLES" comment="" introduced="8.0" contribution="contributed" in_production_device_rom="yes" source_size="49781">
+ <unit bldFile="os/graphics/opengles/openglesdisplayproperties/group" mrp="os/graphics/opengles/openglesdisplayproperties/group/graphics_openglesdisplayproperty.mrp"/>
+ </component>
+ </collection>
+ <collection name="openvg" original-name="OpenVG" long-name="OpenVG" id="OpenVG" level="internal-adaptations" contribution="contributed">
+ <component name="openvginterface" original-name="OpenVG Interface" long-name="OpenVG Interface" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="OpenVG" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="74341">
+ <unit bldFile="os/unref/orphan/comgen/graphics/openvgheaders/group" mrp="os/unref/orphan/comgen/graphics/openvgheaders/group/graphics_openvgheaders.mrp"/>
+ </component>
+ <component name="openvgimplementation" original-name="OpenVG Implementation" long-name="OpenVG Implementation" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="OpenVG" comment="" introduced="9.5" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Various Commercial and OSS" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Various Licenses" in_production_device_rom="yes" platform_critical="no" source_size="24102923">
+ <unit bldFile="os/unref/orphan/comgen/graphics/OpenVG/group/" mrp="os/unref/orphan/comgen/graphics/OpenVG/group/graphics_openvg.mrp"/>
+ </component>
+ </collection>
+ <collection name="egl" original-name="EGL" long-name="EGL" id="EGL" level="internal-adaptations" contribution="contributed">
+ <component name="eglinterface" original-name="EGL Interface" long-name="EGL Interface" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="EGL" comment="" introduced="9.4" contribution="contributed" in_production_device_rom="yes" source_size="82517">
+ <unit bldFile="os/graphics/egl/eglinterface/group" mrp="os/graphics/egl/eglinterface/group/graphics_eglheaders.mrp"/>
+ </component>
+ <component name="eglimplementation" original-name="EGL Implementation" long-name="EGL Implementation" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="EGL" comment="" introduced="9.4" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Hybrid Graphics; Various Commercial and OSS" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Hybrid Graphics; Khronos; Hybrid Graphics" in_production_device_rom="yes" platform_critical="no" source_size="550082">
+ <unit bldFile="os/graphics/egl/eglimplementation/group/" mrp="os/graphics/egl/eglimplementation/group/graphics_egl.mrp"/>
+ </component>
+ </collection>
+ <collection name="graphicsdeviceinterface" original-name="Graphics Device Interface" long-name="Graphics Device Interface" id="Graphics Device Interface" level="device-interface" contribution="contributed">
+ <component name="bitgdi" original-name="BitGDI" long-name="BitGDI" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Device Interface" comment="" contribution="contributed" in_production_device_rom="yes" source_size="1918769">
+ <unit bldFile="os/graphics/graphicsdeviceinterface/bitgdi/group" mrp="os/graphics/graphicsdeviceinterface/bitgdi/group/graphics_bitgdi.mrp"/>
+ </component>
+ <component name="colourpalette" original-name="Colour Palette" long-name="Colour Palette" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Device Interface" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="7777">
+ <unit bldFile="os/graphics/graphicsdeviceinterface/colourpalette/group" mrp="os/graphics/graphicsdeviceinterface/colourpalette/group/graphics_palette.mrp"/>
+ </component>
+ <component name="screendriver" original-name="Screen Driver" long-name="Screen Driver" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Device Interface" comment="" plugin="Y" introduced="6.1" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="534610">
+ <unit bldFile="os/graphics/graphicsdeviceinterface/screendriver/group" mrp="os/graphics/graphicsdeviceinterface/screendriver/group/graphics_screendriver.mrp"/>
+ </component>
+ <component name="directgdi" original-name="DirectGDI" long-name="DirectGDI" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Device Interface" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="15362711">
+ <unit bldFile="os/unref/orphan/comgen/graphics/directgdi/group" mrp="os/unref/orphan/comgen/graphics/directgdi/group/graphics_directgdi.mrp"/>
+ </component>
+ <component name="directgdiinterface" original-name="DirectGDI Interface" long-name="DirectGDI Interface" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Device Interface" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="16302">
+ <unit bldFile="os/unref/orphan/comgen/graphics/directgdiheaders/group" mrp="os/unref/orphan/comgen/graphics/directgdiheaders/group/graphics_directgdiheaders.mrp"/>
+ </component>
+ <component name="directgdiadaptation" original-name="DirectGDI Adaptation" long-name="DirectGDI Adaptation" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Device Interface" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="162469">
+ <unit bldFile="os/unref/orphan/comgen/graphics/directgdiadapter/group" mrp="os/unref/orphan/comgen/graphics/directgdiadapter/group/graphics_directgdiadapter.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Text and Localisation" tech_domain="ui" level="services" name="textandloc" levels="device encoding fonts text" contribution="contributed">
+ <collection name="charconvfw" id="uiutils" long-name="UI Utils" level="encoding" contribution="contributed">
+ <component name="Charconv" long-name="Charconv" id="Charconv" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\Charconv" source_size="1499151.6"/>
+ <component name="Charconvplugin" long-name="Charconv Plugin" id="Charconvplugin" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\Charconvplugin" source_size="1236719.4"/>
+ <component name="AknJapaneseReading" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\AknJapaneseReading" source_size="151954.5"/>
+ <component name="CommonAdapter" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\CommonAdapter" source_size="121649.7"/>
+ <component name="Findutil" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\Findutil" source_size="348619.8"/>
+ <component name="gamerecognizer" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\gamerecognizer" source_size="157653.3"/>
+ <component name="inlinetext" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\inlinetext" source_size="11499.6"/>
+ <component name="JPLangUtil" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\JPLangUtil" source_size="410178.9"/>
+ <component name="Localizer" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\Localizer" source_size="210273.0"/>
+ <component name="numbergrouping" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\numbergrouping" source_size="75635.7"/>
+ <component name="SortUtil" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uiutils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uiutils\SortUtil" source_size="236938.8"/>
+ <component name="charconvfw" original-name="Character Encoding and Conversion Framework" long-name="Character Encoding and Conversion Framework" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Character Conversion Framework" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="289526">
+ <unit bldFile="os/textandloc/charconvfw/charconvfw/group" mrp="os/textandloc/charconvfw/charconvfw/group/syslibs_charconv.mrp"/>
+ </component>
+ <component name="charconvplugins" original-name="Character Encoding and Conversion Plugins" long-name="Character Encoding and Conversion Plugins" old_model="MCL" old_layer="OS Services" old_package="Generic OS Services" old_collection="Character Conversion Framework" comment="" plugin="Y" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="Unicode OSS" license_status="No" ship_license="No" source="yes" partial_contribution="" license="Unicode OSS; Taligent (test code)" in_production_device_rom="yes" platform_critical="no" source_size="1031765">
+ <unit bldFile="os/textandloc/charconvfw/charconvplugins/group" mrp="os/textandloc/charconvfw/charconvplugins/group/syslibs_charconv_plugins.mrp"/>
+ </component>
+ </collection>
+ <collection name="fontservices" id="Fonts Services" level="fonts" contribution="contributed">
+ <component name="textshaperplugin" original-name="Text Shaper Plugin" long-name="Text Shaper Plugin" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Fonts Services" comment="" plugin="Y" introduced="9.2" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="IBM OSS License" license_status="No" ship_license="Mandatory" source="yes" partial_contribution="" license="IBM OSS License" in_production_device_rom="yes" platform_critical="no" source_size="1809152">
+ <unit bldFile="os/textandloc/fontservices/textshaperplugin/group" mrp="os/textandloc/fontservices/textshaperplugin/group/graphics_iculayoutengine.mrp"/>
+ </component>
+ <component name="fontstore" original-name="Font Store" long-name="Font Store" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Fonts Services" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="3164736">
+ <unit bldFile="os/textandloc/fontservices/fontstore/group" mrp="os/textandloc/fontservices/fontstore/group/graphics_fntstore.mrp"/>
+ </component>
+ <component name="freetypefontrasteriser" original-name="FreeType Font Rasteriser" long-name="FreeType Font Rasteriser" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Fonts Services" comment="" plugin="Y" contribution="excluded" not_used_by_s60="yes" export_restricted="no" license_type="commercial" copyright_holder="Apple Computer; Various OSS" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Apple Computer; Various OSS" in_production_device_rom="yes" platform_critical="no" source_size="1946886">
+ <unit bldFile="os/textandloc/fontservices/freetypefontrasteriser/group" mrp="os/textandloc/fontservices/freetypefontrasteriser/group/graphics_freetype.mrp"/>
+ </component>
+ <component name="referencefonts" original-name="Reference Fonts" long-name="Reference Fonts" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Fonts Services" comment="" introduced="6.0" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="CMS-000078; Commercial; Electronic Font Foundry; Monotype" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="CMS-000078; Commercial; Electronic Font Foundry; Monotype" in_production_device_rom="no" platform_critical="no" source_size="1405749">
+ <unit bldFile="os/textandloc/fontservices/referencefonts/group" mrp="os/textandloc/fontservices/referencefonts/group/graphics_fonts.mrp"/>
+ </component>
+ </collection>
+ <collection name="graphicsdevif" level="device" contribution="contributed">
+ <component name="gdi" original-name="GDI" long-name="GDI" id="GDI" old_model="MCL" old_layer="OS Services" old_package="Graphics" old_collection="Graphics Device Interface" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="756814">
+ <unit bldFile="os/textandloc/graphicsdevif/gdi/group" mrp="os/textandloc/graphicsdevif/gdi/group/graphics_gdi.mrp"/>
+ </component>
+ </collection>
+ <collection name="textrendering" long-name="Text Rendering" id="Text Rendering" level="text" contribution="contributed">
+ <component name="numberformatting" original-name="Number Formatting" long-name="Number Formatting" id="Number Formatting" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" introduced="7.0s" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="19495">
+ <unit bldFile="mw/classicui/lafagnosticuifoundation/numberformatting/group" mrp="mw/classicui/lafagnosticuifoundation/numberformatting/group/app-framework_numberconversion.mrp"/>
+ </component>
+ <component name="texthandling" original-name="Text Handling" long-name="Text Handling" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Text Rendering" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="448589">
+ <unit bldFile="os/textandloc/textrendering/texthandling/group" mrp="os/textandloc/textrendering/texthandling/group/app-framework_etext.mrp"/>
+ </component>
+ <component name="textformatting" original-name="Text Formatting" long-name="Text Formatting" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Text Rendering" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="2572909">
+ <unit bldFile="os/textandloc/textrendering/textformatting/group" mrp="os/textandloc/textrendering/textformatting/group/app-framework_form.mrp"/>
+ </component>
+ <component name="word" original-name="Word" long-name="Word" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Text Rendering" comment="" class="test" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="171930">
+ <unit mrp="os/textandloc/textrendering/word/group/app-framework_word.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block name="verificationtools" long-name="Verification Tools" levels="libs device-middleware 2 tools-middleware cmd-line GUI" tech_domain="to" level="services" contribution="contributed">
+ <collection name="Test Management" level="GUI">
+ <component name="SVS Test Development (TDEP)" desktop="yes" source="yes" partial_contribution="no" license_status="no" license_type="OSS" license="Apache v2; BSD; Common Public License; EPL v1.0; LGPL 2.1" comment="Contains various forensic matches on java classes and GIFs that need to be cleaned" impl_language="java.eclipse" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/test/tools/TDEP/group" mrp="tools/test/tools/TDEP/group/testtools_tdep.mrp"/>
+ </component>
+ </collection>
+ <collection name="Multi Device Test Tools" level="cmd-line">
+ <component name="usecasecontroller" original-name="Use Case Controller" long-name="Use Case Controller" desktop="yes" source="yes" partial_contribution="" license_status="No" license_type="OSS" license="Sun OSS (unknown); Python License (forensic); Martin Gergeleit (unknown)" comment="Contains forensic matches on GIFs that need to be cleaned and an unrestricted use licernse from SUN" impl_language="c.c++" plugin="no" old_model="TCL" not_used_by_s60="yes" export_restricted="no" contribution="available" copyright_holder="OSS" ship_license="No" in_production_device_rom="no" platform_critical="no" source_size="3396041">
+ <unit root="TCL" bldFile="tools/test/tools/ucc/BuildScripts/group" mrp="tools/test/tools/ucc/BuildScripts/group/testtools_ucc.mrp"/>
+ <unit bldFile="os/verificationtools/multidevicetesttools/usecasecontroller/BuildScripts/group" mrp="os/verificationtools/multidevicetesttools/usecasecontroller/BuildScripts/group/testtools_ucc.mrp"/>
+ </component>
+ <component name="SVS Response Server" desktop="yes" impl_language="perl" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" mrp="tools/test/infrastructure/desktop-test-network/Installer/group/desktop_test_network.mrp"/>
+ </component>
+ <component name="Backup and Restore Test Server" mcl_component="BURTESTSERVER" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/verificationtools/multidevicetesttools/backupandrestoretestserver/Group" mrp="os/verificationtools/multidevicetesttools/backupandrestoretestserver/Group/testtools_burtestserver.mrp"/>
+ </component>
+ </collection>
+ <collection name="Single Device Test Tools" level="cmd-line">
+ <component name="testtoolsdesktop" original-name="Test Tools Desktop" long-name="Test Tools Desktop" desktop="yes" mcl_component="Test Tools Desktop" impl_language="java.eclipse" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="available" license_type="OSS" copyright_holder="Various OSS" license_status="Open" ship_license="No" source="yes" partial_contribution="" license="Microsoft; Fair License (forensic); BSD 2.0 (forensic); Apache 1.1 (forensic); Apache 2.0 (forensic); Eclipse 1.0 (forensic);" in_production_device_rom="no" platform_critical="no" source_size="60684801"> <unit bldFile="os/verificationtools/singledevicetesttools/testtoolsdesktop/group" mrp="os/verificationtools/singledevicetesttools/testtoolsdesktop/group/testtools_desktop.mrp"/>
+ </component>
+ <component name="Test Driver 2.1" desktop="yes" comment="There is still an old version in the MCL" mcl_component="TESTDRIVER" impl_language="java" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Various Commercial and OSS" license_status="No" ship_license="No" source="yes" license="GPL 2.0 (forensic); Fair License (forensic); BSD 2.0 (forensic); Apache 1.1 (forensic); Apache 2.0 (forensic); Common Public License (forensic)" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/verificationtools/singledevicetesttools/testdriver2.1/Group" mrp="os/verificationtools/singledevicetesttools/testdriver2.1/Group/testtools_testdriver.mrp"/>
+ </component>
+ </collection>
+ <collection name="Test Tools Connectivity" level="tools-middleware">
+ <component name="statdesktop" original-name="STAT_DESKTOP" long-name="STAT Desktop" desktop="yes" source="yes" partial_contribution="yes" license_status="no" license_type="commercial" license="Various commercial (forensic)" comment="Contains forensic matches on header files" impl_language="c.c++" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="partial" in_production_device_rom="no" platform_critical="no" source_size="3030050">
+ <unit root="TCL" bldFile="tools/test/tools/stat/desktop/group" mrp="tools/test/tools/stat/desktop/group/testtools_stat_desktop.mrp"/>
+ </component>
+ <component name="ON RPC" desktop="yes" source="no" partial_contribution="no" license_status="no" copyright_holder="Sun Microsystems" license_type="commercial" license="Sun Microsystems" comment="Used by TestDriver" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="excluded">
+ <unit root="TCL" bldFile="tools/3rdparty/oncrpc/group" mrp="tools/3rdparty/oncrpc/group/tools_oncrpc.mrp"/>
+ </component>
+ <component name="WinTap" source="no" partial_contribution="no" license_type="commercial" license_status="no" copyright_holder="Microsoft; Untangle Gateway Platform" license="Microsoft; GPLv2" comment="Used by TestDriver" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="excluded">
+ <unit root="TCL" bldFile="tools/3rdparty/wintap/group" mrp="tools/3rdparty/wintap/group/tools_wintap.mrp"/>
+ </component>
+ </collection>
+ <collection name="Parser Generator" level="tools-middleware">
+ <component name="ANTLR" desktop="yes" source="no" partial_contribution="no" license_status="no" copyright_holder="www.antlr.org" license_type="OSS" license="BSD2" comment="Used to for generating the parser for Test Driver" impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Test Execution Frameworks" level="device-middleware">
+ <component name="STATAPI" source="yes" partial_contribution="yes" license_status="no" license_type="commercial" license="Various commercial (forensic)" comment="Contains forensic matches on header files and bitmaps" mcl_component="Stat API;Stat Source" impl_language="os" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" contribution="partial">
+ <unit root="MCL" bldFile="os/unref/comtt/stat/device/source/statapi/console" mrp="os/unref/comtt/stat/device/group/testtools_stat_device_gt.mrp"/>
+ <unit root="MCL" mrp="os/unref/comtt/stat/group/testtools_stat_common_source.mrp"/>
+ <unit root="TCL" bldFile="tools/test/tools/stat/device/source/statapi/console" mrp="tools/test/tools/stat/device/group/testtools_stat_device_gt.mrp"/>
+ </component>
+ <component name="Test Tools Utilities" mcl_component="RFile Logger" impl_language="os" deprecated="Future" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="os/unref/comtt/utilities/group/testtools_utilities.mrp" bldFile="os/unref/comtt/utilities/group"/>
+ <unit root="TCL" bldFile="tools/test/tools/utilities/group" mrp="tools/test/tools/utilities/group/testtools_utilities.mrp"/>
+ <unit root="TCL" bldFile="tools/test/tools/utilities/wrapperutils/group" mrp="tools/test/tools/utilities/wrapperutils/group/testtools_utilities5.mrp"/>
+ </component>
+ <component name="TEF" impl_language="os" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/test/tools/testexecute/group" mrp="tools/test/tools/testexecute/group/tools_testexecute.mrp"/>
+ </component>
+ <component name="TEF Unit" impl_language="os" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Config File Parsers" level="libs">
+ <component name="INI File Parser" mcl_component="CINIDATA" impl_language="os" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/verificationtools/configfileparsers/inifileparser" mrp="os/verificationtools/configfileparsers/inifileparser/tools_cinidata.mrp"/>
+ </component>
+ </collection>
+ <collection name="Legacy Tools" level="cmd-line">
+ <component name="mmtesttools" original-name="Multimedia Test Tools" long-name="Multimedia Test Tools" mcl_component="Multimedia Test Tools" impl_language="perl" desktop="yes" codeline="mcl" deprecated="Future" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="255019"> <unit mrp="os/verificationtools/legacytools/mmtesttools/Group/multimedia_testtools_source.mrp"/>
+ </component>
+ </collection>
+ <collection name="Legacy Frameworks" level="device-middleware">
+ <component name="mmtestfw" original-name="Multimedia Test Framework" long-name="Multimedia Test Framework" mcl_component="Multimedia Test Framework" impl_language="os" codeline="mcl" deprecated="Future" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="94945"> <unit mrp="os/verificationtools/legacyframeworks/mmtestfw/group/multimedia_testframework_source.mrp"/>
+ </component>
+ <component name="mmtestfwunittests" original-name="Multimedia Test Framework Unit Tests" long-name="Multimedia Test Framework Unit Tests" mcl_component="Multimedia Test Framework Unit Tests" impl_language="os" codeline="mcl" deprecated="Future" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="85677"> <unit mrp="os/verificationtools/legacyframeworks/mmtestfwunittests/group/multimedia_unittest_testframework_source.mrp"/>
+ </component>
+ <component name="mmtestagent" original-name="Multimedia Test Agent" long-name="Multimedia Test Agent" mcl_component="Multimedia Test Agent" impl_language="os" codeline="mcl" deprecated="Future" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="16290"> <unit mrp="os/verificationtools/legacyframeworks/mmtestagent/group/multimediatestagent_source.mrp"/>
+ </component>
+ <component name="securitytestfw" original-name="Security Test Framework" long-name="Security Test Framework" mcl_component="Security Test Framework" impl_language="os" codeline="mcl" deprecated="Future" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="yes" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="2047474"> <unit mrp="os/verificationtools/legacyframeworks/securitytestfw/group/security_testframework.mrp"/>
+ </component>
+ <component name="msgtestfw" original-name="Messaging Test Framework" long-name="Messaging Test Framework" mcl_component="Messaging Test Framework" impl_language="os" codeline="mcl" deprecated="Future" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="4378557"> <unit mrp="os/verificationtools/legacyframeworks/messagingtestfw/group/messaging_testframework.mrp"/>
+ </component>
+ </collection>
+ <collection name="Static Analysis Guides" level="GUI">
+ <component name="AURA Guide" desktop="yes" source="yes" partial_contribution="no" license="UIQ SDK 3.1 (UIQ icons)" impl_language="data" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="CDB Guide" desktop="yes" source="yes" partial_contribution="no" license="UIQ SDK 3.1 (UIQ icons)" impl_language="data" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Image Checker Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Source Analysis" level="cmd-line">
+ <component name="Migration Tool" desktop="yes" mcl_component="MIGRATIONTOOL" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" license="Cygwin (binary); Perl Artistic" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/verificationtools/sourceanalysis/migrationtool/group" mrp="os/verificationtools/sourceanalysis/migrationtool/group/testtools_migrationtool.mrp"/>
+ </component>
+ <component name="Leavescan" desktop="yes" mcl_component="LEAVESCAN" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/verificationtools/sourceanalysis/leavescan/group" mrp="os/verificationtools/sourceanalysis/leavescan/group/testtools_leavescan.mrp"/>
+ </component>
+ <component name="Program Checker" desktop="yes" mcl_component="PROGRAMCHECKER" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/verificationtools/sourceanalysis/programchecker/group" mrp="os/verificationtools/sourceanalysis/programchecker/group/testtools_programchecker.mrp"/>
+ </component>
+ <component name="Aura" desktop="yes" license_status="no" license_type="OSS" license="MIT License v2; Apache License Version 2.0; Common Public License; BSD 2.0; Jaxen License; Apache 1.1 (http://www.panopticode.org/)" comment="Component contains 3rd party binary re-distributions of dependent libraries" impl_language="java" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/analysis/aura/group" mrp="tools/analysis/aura/group/tools_aura.mrp"/>
+ </component>
+ <component name="cdb" original-name="CDB" long-name="Code Database" desktop="yes" license_status="No" license_type="OSS" license="Various OSS" comment="Component contains 3rd party binary re-distributions of dependent libraries" impl_language="java" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="available" copyright_holder="Various OSS" ship_license="No" source="yes" partial_contribution="" in_production_device_rom="no" platform_critical="no" source_size="34141761">
+ <unit root="TCL" bldFile="tools/analysis/cdb/group" mrp="tools/analysis/cdb/group/tools_cdb.mrp"/>
+ </component>
+ </collection>
+ <collection name="Binary Analysis" level="cmd-line">
+ <component name="Capability Tools" desktop="yes" mcl_component="CAPTOOLS" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/verificationtools/binaryanalysis/capabilitytools/group" mrp="os/verificationtools/binaryanalysis/capabilitytools/group/testtools_captools.mrp"/>
+ </component>
+ <component name="Dependency Checker" desktop="yes" mcl_component="DEPCHECK" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/verificationtools/binaryanalysis/dependencychecker" mrp="os/verificationtools/binaryanalysis/dependencychecker/tools_depcheck.mrp"/>
+ </component>
+ <component name="Dependency Model" desktop="yes" mcl_component="Dependency Modeller" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Perl Artistic; GPL 2.0" license_status="No" ship_license="No" source="yes" license="Perl Artistic; GPL 2.0" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/verificationtools/binaryanalysis/dependencymodel/group" mrp="os/verificationtools/binaryanalysis/dependencymodel/tools_depmodel.mrp"/>
+ </component>
+ <component name="Image Checker" desktop="yes" license_status="no" partial_contribution="yes" license_type="OSS" license="MIT License V2 (http://xmlsoft.org/)" comment="Contains libxml library" impl_language="c.c++" plugin="no" old_model="TCL" contribution="partial">
+ <unit root="TCL" bldFile="tools/analysis/imgcheck/group" mrp="tools/analysis/imgcheck/group/tools_imgcheck.mrp"/>
+ </component>
+ </collection>
+ <collection name="Compiler front-ends" level="tools-middleware">
+ <component name="EDG" desktop="yes" source="no" license_status="no" license="Copyright 2005; Edison Design Group; Inc. (http://www.edg.com/)" copyright_holder="Edison Design Group" license_type="commercial" comment="Used by AURA" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="excluded">
+ <unit root="TCL" bldFile="tools/3rdparty/edg/group" mrp="tools/3rdparty/edg/group/tools_edg.mrp"/>
+ </component>
+ <component name="GCC-XML" desktop="yes" source="yes" copyright_holder="http://www.gccxml.org/HTML/Index.html" license_status="no" license="GPL; Copyright (c) 2002-2007 Kitware; Inc.; Insight Consortium (http://www.gccxml.org/HTML/Index.html)" license_type="commercial" mcl_component="Redistribution" impl_language="c.c++" external="true" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" ship_license="No" partial_contribution="" contribution="excluded">
+ <unit root="MCL" bldFile="os/buildtools/perltoolsplatform/perl" mrp="os/buildtools/perltoolsplatform/perl/tools_redistribution_common.mrp"/>
+ </component>
+ </collection>
+ <collection name="Static Analysis" level="GUI">
+ <component name="AnalyzeTool" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="NOK, contains 3rd party sw" desktop="yes" foundation="no" comment="Idea is to add this in a near future to be part of the Carbide.c++ product. Should be then discussed again if we put to foundation." contribution="excluded" old_model="S60Tools"/>
+ <component name="AnalyzeTool Carbide Extension" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="NOK, extension side includes EPL software and to be able to use the extension it requires AnalyzeTool core which is NOK" desktop="yes" foundation="no" comment="See comments above (AnalyzeTool)" contribution="excluded" old_model="S60Tools"/>
+ <component name="API Query Tool" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="OK, with changes (contain non-mandatory third party components)" desktop="yes" foundation="no" contribution="excluded" old_model="S60Tools"/>
+ <component name="AppDep " tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="NOK, contains 3rd party components under GPL. " desktop="yes" foundation="yes" comment="AppDep is a part of the Dependency Explorer which is a part of the Carbide.c++" mcl_component="appdep" contribution="contributed" old_model="S60Tools"/>
+ <component name="Compatibility Analyser" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="NOK, contains 3rd party components under GPL" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Dependency Analyser" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="OK, with changes (contain non-mandatory third party components)" desktop="yes" foundation="no" comment="Nokia specific solution" contribution="excluded" old_model="S60Tools"/>
+ <component name="Dependency Explorer" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="NOK, contains 3rd party components under GPL. " desktop="yes" foundation="yes" comment="Part of the Carbide.c++ product" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="Test Tools" level="cmd-line">
+ <component name="ASTE" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="NOK" desktop="yes" foundation="no" comment="ASTE, ATS, HTI/OTI used also at Maemo side. QT support planned for ATS, ASTE" contribution="excluded" old_model="S60Tools"/>
+ <component name="ATS" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="NOK" desktop="yes" foundation="no" comment="ASTE, ATS, HTI/OTI used also at Maemo side. QT support planned for ATS, ASTE" contribution="excluded" old_model="S60Tools"/>
+ <component name="HTI" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="NOK, contains 3rd party sw" desktop="no" foundation="yes" comment="OEM version to be provided (which is under development)" contribution="contributed" old_model="S60Tools"/>
+ <component name="LUX" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="N/A" desktop="yes" foundation="no" comment="ASTE, ATS, HTI/OTI used also at Maemo side. QT support planned for ATS, ASTE" contribution="excluded" old_model="S60Tools"/>
+ <component name="MultiTest Runner" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" comment="Not so sure if this is valid because the tool is only the launcher for 3rd party analysis tools (that are part of SymSEE release)" contribution="contributed" old_model="S60Tools"/>
+ <component name="STIF" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" mcl_component="stifui;stif" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="Compatibility" level="libs">
+ <component name="BCApps" long-name="BC Apps" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="no" comment="Old tool, not so relevant anymore. BC Drivers will replace." mcl_component="BcApps" contribution="excluded" old_model="S60Tools"/>
+ <component name="BCDrivers" long-name="BC Drivers" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="NOK, contains also Symbian's content and other copyrights that needs to be solved" desktop="no" foundation="yes" mcl_component="bcdrivers" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="Utilities" level="2">
+ <component name="ConnTest" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="N/A" desktop="no" foundation="yes" comment="Owner of the tool is Networking team (Leppilahti Juha)" contribution="contributed" old_model="S60Tools"/>
+ <component name="Creator " tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="creator" contribution="contributed" old_model="S60Tools"/>
+ <component name="FileBrowser" long-name="File Browser" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="filebrowser" contribution="contributed" old_model="S60Tools"/>
+ <component name="Launcher" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="launcher" contribution="contributed" old_model="S60Tools"/>
+ <component name="ScreenGrabber" long-name="Screen Grabber" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="screengrabber" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="Performance" level="device-middleware">
+ <component name="Load Generator" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="LoadGen.exe=binary" contribution="contributed" old_model="S60Tools"/>
+ <component name="TaskMgr" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Verification Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="taskmgr.exe=binary;memoryaccess_eka2" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="isctesttool" id="IscTestTool" long-name="ISC Test Tool" level="device-middleware" contribution="contributed">
+ <component name="IscTestStub" old_model="s60" old_layer="tools" old_package="systemswtools" old_collection="IscTestTool" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\tools\systemswtools\IscTestTool\IscTestStub" source_size="24390.3"/>
+ <component name="IscTestTool" old_model="s60" old_layer="tools" old_package="systemswtools" old_collection="IscTestTool" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\tools\systemswtools\IscTestTool\IscTestTool" source_size="111568.8"/>
+ </collection>
+ <collection name="dsytesttool" id="dsytesttool" long-name="DSY Test Tool" level="device-middleware" contribution="contributed">
+ <component name="dosservercontrol" old_model="s60" old_layer="tools" old_package="systemswtools" old_collection="dsytesttool" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\tools\systemswtools\dsytesttool\dosservercontrol" source_size="49503.6"/>
+ <component name="dsytfcore" old_model="s60" old_layer="tools" old_package="systemswtools" old_collection="dsytesttool" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\tools\systemswtools\dsytesttool\dsytfcore" source_size="67675.2"/>
+ <component name="dsytfstifadapter" old_model="s60" old_layer="tools" old_package="systemswtools" old_collection="dsytesttool" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\tools\systemswtools\dsytesttool\dsytfstifadapter" source_size="16614.3"/>
+ </collection>
+ </block>
+ <block name="Instruction Set Simulation" levels="1 2 plugins 4 cmd-line" tech_domain="to" level="hw" contribution="contributed">
+ <collection name="Simulator Core" level="cmd-line">
+ <component name="QEMU" desktop="yes" source="no" partial_contribution="no" license_type="OSS" license_status="no" copyright_holder="http://bellard.org/qemu/" license="GNU General Public License" comment="Changes to QEMU are necessary; which are subcontracted to http://www.codesourcery.com/ and committed back into QEMU main line." impl_language="c.c++" external="true" introduced="Saffron" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="QEMU Models" level="plugins">
+ <component name="Generic" desktop="yes" source="no" partial_contribution="no" license_type="OSS" license_status="Open" copyright_holder="http://www.codesourcery.com/" license="BSD license" comment="Current license proposal is to host models with QEMU; but have the right to re-distribute. Work has commenced: prototype exists; beta available in Jan; final version in March 09" impl_language="c.c++" introduced="Saffron" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="BSPs" level="1">
+ <component name="Generic QEMU" source="yes" partial_contribution="no" comment="Work has commenced: prototype exists; beta available in Jan; final version in March 09" impl_language="os" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="PlatSim" level="plugins">
+ <component name="HW Model Platform" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Emulator" license="OEM LICENSE AGREEMENT for next generation emulator" source="no" ship_license_required="yes" copyright_holder="ARM and Nokia" license_status="NOK" desktop="yes" foundation="?" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="SIMA GUI" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Emulator" license="OEM LICENSE AGREEMENT for next generation emulator" source="no" ship_license_required="yes" copyright_holder="Nokia" license_status="NOK" desktop="yes" foundation="?" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="SIMA Engine" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Emulator" license="OEM LICENSE AGREEMENT for next generation emulator" source="no" ship_license_required="yes" copyright_holder="Nokia" license_status="NOK" desktop="yes" foundation="?" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ </collection>
+ </block>
+ <block name="buildtools" long-name="Build Tools" levels="0 1 2 3 GUI" tech_domain="to" level="hw" contribution="contributed">
+ <collection name="Build Tool Guides" level="GUI">
+ <component name="ROM Tools Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Emulator Builder Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="SBSv2 Guide" desktop="yes" license="contains UIQ SDK 3.1 (UIQ icons)" impl_language="data" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Build Tools UI Guides" level="GUI">
+ <component name="Visual ROFS Builder Guide" desktop="yes" source="yes" license="Eclipse Public License v1.0; BSD2.0; Common Public License; Apache 2 (http://vmgump.apache.org/gump/public/cglib/cglib-nodep/index.html); Common Public License (http://emma.sourceforge.net/); http://www.jmock.org/license.html; Public Domain (http://www.sqlite.org/); Apache License Version 2.0 (Jaxmao Tomcat); Apache v2 (Log4J); JUnit" comment="The remaining items are mainly images. Also contains a complete Eclipse re-distribution in the source tree" impl_language="data" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/product/customisation/vrb/group" mrp="tools/product/customisation/vrb/group/tools_vrb.mrp"/>
+ </component>
+ </collection>
+ <collection name="Build Tools UIs" level="GUI">
+ <component name="Visual ROFS Builder" desktop="yes" impl_language="java.eclipse" license_status="no" source="yes" license_type="OSS" license="Eclipse Public License v1.0; BSD2.0; Common Public License; Apache 2 (http://vmgump.apache.org/gump/public/cglib/cglib-nodep/index.html); Common Public License (http://emma.sourceforge.net/); http://www.jmock.org/license.html; Public Domain (http://www.sqlite.org/); Apache License Version 2.0 (Jaxmao Tomcat); Apache v2 (Log4J); JUnit" comment="Contains re-distributions of OSS components" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="SBSv2 Builder" desktop="yes" impl_language="java.eclipse" prototype="true" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Help Compiler UI" desktop="yes" mcl_component="CSHLPCMP_GUI;SPLASH" impl_language="java" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/cshlpcmp_gui/group" mrp="os/unref/comgen/tools/sdk_eng/cshlpcmp_gui/group/tools_sdk_eng_cshlpcmp_gui.mrp" priority="1010"/>
+ <unit root="MCL" bldFile="os/buildtools/buildtoolsuis/helpcompilerui/group" mrp="os/buildtools/buildtoolsuis/helpcompilerui/group/tools_sdk_eng_splash.mrp"/>
+ </component>
+ <component name="SISAR" desktop="yes" mcl_component="SISAR" comment="UI wrapper for MakeSIS; non-Eclipse" impl_language="java.eclipse" deprecated="Future" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" contribution="contributed" platform_critical="undefined"/>
+ </collection>
+ <collection name="Build Infrastructure" level="3">
+ <component name="Build System Tools" desktop="yes" mcl_component="BUILDSYSTEMTOOLS" comment="Symbian internal XML files and some host scripts to check out sources from Perforce to build the CustKit." impl_language="data" infra="true" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="yes" platform_critical="no" copyright_holder="Various OSS" license_status="" ship_license="No" source="yes" license="Perl Artistic; GPL 2.0" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/buildtools/buildinfrastructure/buildsystemtools/group" mrp="os/buildtools/buildinfrastructure/buildsystemtools/group/tools_build.mrp"/>
+ </component>
+ <component name="commonutils" original-name="Common Utils" long-name="Common Utils" desktop="yes" mcl_component="Common Utils" comment="Data files describing schedule 12 and associated scripts." impl_language="data" infra="true" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="available" license_type="OSS" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" partial_contribution="" license="GPL 2.0; Perl Artistic; OSS (Unknown)" in_production_device_rom="yes" platform_critical="no" source_size="392893"> <unit mrp="os/buildtools/buildinfrastructure/commonutils/tools_utils_common.mrp"/>
+ </component>
+ <component name="cedarutils" original-name="Cedar Utils" long-name="Cedar Utils" desktop="yes" mcl_component="Cedar Utils" comment="Contains helper scripts for building the CustKits." impl_language="data" infra="true" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="yes" platform_critical="no" source_size="81164"> <unit mrp="os/buildtools/buildinfrastructure/cedarutils/tools_utils_cedar.mrp"/>
+ </component>
+ </collection>
+ <collection name="Symbian Build System v1" level="3">
+ <component name="e32toolp" original-name="E32 Perl Tools" long-name="E32 Perl Tools" desktop="yes" mcl_component="E32 Perl Tools" comment="MAKMAKE; BLDMAKE; ETC." impl_language="perl" deprecated="Future" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="11861207"> <unit mrp="os/buildtools/symbianbuildsystemv1/e32toolp/group/tools_e32toolp.mrp"/>
+ </component>
+ <component name="EBS" desktop="yes" mcl_component="BUILD-TOOLS" comment="Parallel build wrapper for system builds." impl_language="perl" deprecated="Future" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/buildtools/symbianbuildsystemv1/ebs/group" mrp="os/buildtools/symbianbuildsystemv1/ebs/group/tools_sdk_eng_build-tools.mrp"/>
+ </component>
+ </collection>
+ <collection name="Symbian Build System v2" level="3">
+ <component name="Raptor Core" desktop="yes" impl_language="python" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="WINSCW Build" desktop="yes" impl_language="make" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="ABIv1 Build" desktop="yes" impl_language="make" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="ABIv2 Build" desktop="yes" impl_language="make" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Tools2 Build" desktop="yes" impl_language="make" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="GCC-E Build" desktop="yes" impl_language="make" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Make Engines" level="1">
+ <component name="GNU Make" desktop="yes" source="no" partial_contribution="no" license_type="OSS" license_status="no" copyright_holder="http://www.gnu.org/" license="http://www.gnu.org/software/automake/manual/make/index.html#toc_GNU-Free-Documentation-License" comment="Using GNU 3.81 for SBSv2. Redistributed with SBSv2. Some changes to open source code were made that still need contributing back." impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="PVM GMake" desktop="yes" source="no" partial_contribution="no" license_type="OSS" license_status="no" copyright_holder="http://pvmgmake.sourceforge.net/" license="OSI Approved GNU General Public License (http://pvmgmake.sourceforge.net/)" comment="Redistributed with SBSv2 in //DP/master/build/raptor/dist/pvmgmake" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="Electric Make" desktop="yes" license_type="commercial" source="no" license_status="no" copyright_holder="http://www.electric-cloud.com/" license="http://www.electric-cloud.com/" platform_optional="yes" reason="Additional build engine" impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" contribution="excluded"/>
+ </collection>
+ <collection name="SBSv2 Redistributions" level="1">
+ <component name="Linux Tools" desktop="yes" source="no" partial_contribution="no" license_status="no" copyright_holder="GNU" license="GPL v2" license_type="OSS" comment="Redistribution of various Linux binaries and man pages in //DP/master/build/raptor/linux-i368; in some cases including source in a ZIP file" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="Windows Tools" desktop="yes" license_status="no" copyright_holder="http://www.mingw.org/" license="GPL v2(http://www.mingw.org/); BSD2; BZip2; LGPL2.1" license_type="OSS" comment="Redistribution of various windows binaries and man pages in //DP/master/build/raptor/win32; in some cases including source in a ZIP file" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Build File Parsers" level="3">
+ <component name="MMP" impl_language="python" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="BLD.INF" impl_language="python" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Build Schemas" level="3">
+ <component name="Build Config" impl_language="data" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Build Specification" impl_language="data" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Image Tools" level="2">
+ <component name="ROM Tools" desktop="yes" mcl_component="ROMKIT_EKA2" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/buildtools/imagetools/romtools/group" mrp="os/buildtools/imagetools/romtools/group/tools_romkit.mrp"/>
+ </component>
+ <component name="Emulator Configurator" desktop="yes" comment="Seems to have been removed from the MCL" impl_language="perl" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/product/customisation/emulatorconfig/group" mrp="tools/product/customisation/emulatorconfig/group/tools_emulatorconfig.mrp"/>
+ </component>
+ <component name="SWI SIS Tools" desktop="yes" mcl_component="Secure Software Install SIS Tools" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit root="MCL" bldFile="os/buildtools/imagetools/swisistools/group" mrp="os/buildtools/imagetools/swisistools/group/security_sistools.mrp"/>
+ </component>
+ <component name="SWI Analysis Tools" desktop="yes" mcl_component="SWI Analysis Toolkit" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="excluded" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Taligent" license_status="No" ship_license="No" source="no" license="Taligent" license_type="commercial" partial_contribution="">
+ <unit root="MCL" bldFile="os/buildtools/imagetools/swianalysistools/group" mrp="os/buildtools/imagetools/swianalysistools/group/security_switools.mrp"/>
+ </component>
+ <component name="Make Keys" desktop="yes" mcl_component="MakeKeys" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="yes" platform_critical="no" copyright_holder="Various OSS" license_status="Open" ship_license="No" source="yes" license="OpenSSL License" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/buildtools/imagetools/makekeys/group" mrp="os/buildtools/imagetools/makekeys/group/security_makekeys.mrp"/>
+ </component>
+ </collection>
+ <collection name="Compilation Toolchains" level="1">
+ <component name="GCC-E" desktop="yes" source="yes" partial_contribution="no" license_type="OSS" copyright_holder="GNU; http://www.codesourcery.com/" license="GPL" license_status="no" comment="CodeSourcery (http://www.codesourcery.com/) maintains a branch of GCC for Symbian which is redistributed in CustKits" mcl_component="Redistribution" impl_language="c.c++" external="true" codeline="mcl" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" ship_license="No" contribution="available">
+ <unit root="MCL" bldFile="os/buildtools/perltoolsplatform/perl" mrp="os/buildtools/perltoolsplatform/perl/tools_redistribution_common.mrp"/>
+ </component>
+ <component name="RVCT" desktop="yes" license_type="commercial" license_status="no" copyright_holder="ARM" license="www.arm.com" comment="Remove or show optional as 3rd party component. Needed to build Symbian OS." impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" contribution="excluded"/>
+ </collection>
+ <collection name="Binary Tools" level="1">
+ <component name="E32TOOLS EKA2" desktop="yes" mcl_component="E32 Tools" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="partial" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" license="STLport License; Various (Unknown)" license_type="OSS" partial_contribution="yes">
+ <unit root="MCL" bldFile="os/buildtools/binarytools/e32toolseka2/group" mrp="os/buildtools/binarytools/e32toolseka2/group/tools_e32tools.mrp"/>
+ </component>
+ <component name="Resource Compiler" desktop="yes" mcl_component="RCOMP" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Free Software Foundation" license_status="Open" ship_license="No" source="yes" license="Free Software Foundation" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/buildtools/binarytools/resourcecompiler/group" mrp="os/buildtools/binarytools/resourcecompiler/group/tools_rcomp.mrp"/>
+ </component>
+ <component name="BM Compiler" desktop="yes" mcl_component="GDI Tools" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/buildtools/binarytools/fontcompiler/group" mrp="os/buildtools/binarytools/fontcompiler/group/graphics_gditools.mrp"/>
+ </component>
+ <component name="Font Compiler" desktop="yes" mcl_component="GDI Tools" impl_language="c.c++" deprecated="Future" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/buildtools/binarytools/fontcompiler/group" mrp="os/buildtools/binarytools/fontcompiler/group/graphics_gditools.mrp"/>
+ </component>
+ <component name="Help Compiler" desktop="yes" mcl_component="CSHLPCMP Frontend;CSHLPCMP Backend;MBMCODEC" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="excluded" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Sun" license_status="No" ship_license="Mandatory" source="no" license="Sun" license_type="commercial" partial_contribution="">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/cshlpcmp_frontend/group" mrp="os/unref/comgen/tools/sdk_eng/cshlpcmp_frontend/group/tools_sdk_eng_cshlpcmp_frontend.mrp"/>
+ <unit root="MCL" mrp="os/unref/comgen/tools/sdk_eng/cshlpcmp_backend/group/tools_sdk_eng_cshlpcmp_backend_srconly.mrp"/>
+ <unit root="MCL" bldFile="os/buildtools/binarytools/helpcompiler/group" mrp="os/buildtools/binarytools/helpcompiler/group/tools_sdk_eng_mbmcodec.mrp"/>
+ </component>
+ <component name="tzcompiler" original-name="Time Zone Compiler" long-name="Time Zone Compiler" desktop="yes" mcl_component="Time Zone Compiler" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="available" license_type="OSS" copyright_holder="BSD" license_status="Open" ship_license="No" source="yes" partial_contribution="" license="BSD" in_production_device_rom="yes" platform_critical="no" source_size="566799"> <unit bldFile="os/buildtools/binarytools/tzcompiler/group" mrp="os/buildtools/binarytools/tzcompiler/group/app-services_tzcompiler.mrp"/>
+ </component>
+ </collection>
+ <collection name="File Converters" level="1">
+ <component name="CJPeg" desktop="yes" mcl_component="CJPEG" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" license="Various OSS" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/buildtools/fileconverters/cjpeg/group" mrp="os/buildtools/fileconverters/cjpeg/group/tools_sdk_eng_cjpeg.mrp"/>
+ </component>
+ <component name="Bitmap Font Tool" desktop="yes" mcl_component="Bitmap Font Tools" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/buildtools/fileconverters/bitmapfonttool/group" mrp="os/buildtools/fileconverters/bitmapfonttool/group/graphics_gdtran.mrp"/>
+ </component>
+ <component name="Help Converters" desktop="yes" mcl_component="ALP2CSH;RTF2PTML" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/alp2csh/group" mrp="os/unref/comgen/tools/sdk_eng/alp2csh/group/tools_sdk_eng_alp2csh.mrp"/>
+ <unit root="MCL" bldFile="os/buildtools/fileconverters/helpconverters/group" mrp="os/buildtools/fileconverters/helpconverters/group/tools_sdk_eng_rtf2ptml.mrp"/>
+ </component>
+ </collection>
+ <collection name="Tools Libraries" level="0">
+ <component name="Open SSL Library" desktop="yes" mcl_component="OpenSSL Library" impl_language="c.c++" codeline="mcl" export_restricted="yes" plugin="no" old_model="TCL" contribution="available" in_production_device_rom="yes" platform_critical="no" copyright_holder="Various OSS" license_status="Open" ship_license="No" source="yes" license="OpenSSL License" license_type="OSS" partial_contribution="">
+ <unit root="MCL" mrp="os/buildtools/toolslibraries/openssllibrary/security_openssl.mrp"/>
+ </component>
+ </collection>
+ <collection name="C++ Tools Platform" level="0">
+ <component name="MinGW GCC" desktop="yes" mcl_component="Redistribution" source="yes" partial_contribution="no" copyright_holder="GNU; MINGW" license="GPL" license_status="no" license_type="OSS" comment="Compiler redistributed in CustKit for TOOLS2 platform including source in a ZIP file. Needed to compile most C/C++ tools" impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" ship_license="No" contribution="available">
+ <unit root="MCL" bldFile="os/buildtools/perltoolsplatform/perl" mrp="os/buildtools/perltoolsplatform/perl/tools_redistribution_common.mrp"/>
+ </component>
+ <component name="STLport Host" desktop="yes" copyright_holder="http://www.stlport.org" source="no" partial_contribution="no" license_type="OSS" mcl_component="STLPORT" license_status="no" license="http://www.stlport.org/doc/license.html" comment="Used as part of the TOOLS2 platform and to build tools such as ELF2E32 which is essential to build Symbian OS binaries" impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" contribution="available">
+ <unit root="MCL" bldFile="os/buildtools/c++toolsplatform/stlporthost/group" mrp="os/buildtools/c++toolsplatform/stlporthost/group/tools_stlport.mrp"/>
+ </component>
+ <component name="CPPunit" source="no" partial_contribution="no" license_type="OSS" copyright_holder="http://sourceforge.net/projects/cppunit" license_status="no" license="LGPL (http://sourceforge.net/projects/cppunit)" comment="Used to unit test most c.c++ code for tools development" impl_language="c.c++" desktop="yes" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Python Tools Platform" level="0">
+ <component name="Python" source="no" partial_contribution="no" license_type="OSS" license_status="no" license="MIT (http://www.py2exe.org/)" impl_language="c.c++" desktop="yes" copyright_holder="http://www.py2exe.org" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="Py2exe" source="no" partial_contribution="no" license_type="OSS" license_status="no" license="http://www.py2exe.org/" comment="Used to build SBSv2 binaries. Not shipped " impl_language="c.c++" desktop="yes" copyright_holder="http://www.py2exe.org/" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Perl Tools Platform" level="0">
+ <component name="Perl" desktop="yes" mcl_component="Redistribution" license_type="commercial" source="yes" partial_contribution="no" license_status="no" copyright_holder="http://www.activestate.com" license="http://www.activestate.com/Products/activeperl/index.mhtml" comment="ActivePerl 5.6.1 redistributed with CustKit to enable building of Symbian OS with SBSv1 (and allow other SDK scripts) out-of-the box" impl_language="c.c++" external="true" codeline="mcl" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" ship_license="No" contribution="excluded">
+ <unit root="MCL" bldFile="os/buildtools/perltoolsplatform/perl" mrp="os/buildtools/perltoolsplatform/perl/tools_redistribution_common.mrp"/>
+ </component>
+ <component name="PerlUnit" desktop="yes" license_type="OSS" source="no" partial_contribution="no" copyright_holder="http://sourceforge.net/projects/perlunit/" license_status="no" license="GPL; Artistic License (http://sourceforge.net/projects/perlunit/)" comment="Used for unit testing much of the " impl_language="perl" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="Perl Utility Lib" desktop="yes" license_type="OSS" source="yes" partial_contribution="no" copyright_holder="Various OSS" license_status="no" ship_license_required="No" license="CPAN Class-Singleton 1.03 (GPL or Artistic) License GNU General Public License CPAN Libxml-enno (GPL or Artistic) License GNU General Public License" mcl_component="PERLLIBRARY;Perl Shared Libraries" comment="Used by SDK building tools; PRF and many other Perl tools" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" ship_license="No" contribution="available">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/perllibrary/group" mrp="os/unref/comgen/tools/sdk_eng/perllibrary/group/tools_sdk_eng_perllibrary.mrp"/>
+ <unit root="MCL" bldFile="os/buildtools/perltoolsplatform/perlutilitylib/group" mrp="os/buildtools/perltoolsplatform/perlutilitylib/group/tools_sdk_eng_perl_shared.mrp"/>
+ </component>
+ </collection>
+ <collection name="ROM Tools" level="2">
+ <component name="imaker" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="romtools" license="S60 OEM R&D" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\platformtools\romtools\imaker" source_size="187758.0"/>
+ <component name="imaker plugin for eclipse" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="romtools" license="S60 OEM R&D" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="bldsystemtools" original-name="Build System Tools" long-name="Build System Tools">
+ <component name="cmaker" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Build Tools" license="S60 OEM R&D" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Bmconv " tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Build Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" comment="Symbian tool which is modified by Nokia" contribution="contributed" old_model="S60Tools"/>
+ <component name="Mifconv" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Build Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" mcl_component="mifconversion" contribution="contributed" old_model="S60Tools"/>
+ <component name="ROFSCreator" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Build Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="N/A" desktop="yes" foundation="no" comment="Replaced by Imaker" contribution="excluded" old_model="S60Tools"/>
+ <component name="SecurityChecker " tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Build Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" mcl_component="securitychecker" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="x86 Tools" level="1">
+ <component name="x86 Compiler" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Build Tools" license="Freescale" source="no" ship_license_required="yes" copyright_holder="Freescale" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="x86 Runtime Libs" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Build Tools" license="Freescale" source="no" ship_license_required="yes" copyright_holder="Freescale" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ </collection>
+ <collection name="Carbide.c++" level="GUI">
+ <component name="SIS Signer" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Contains Nokia specific R&D certification usage" contribution="excluded" old_model="S60Tools"/>
+ </collection>
+ <collection name="gfxconversion" id="gfxconversion" long-name="GFX Conversion" contribution="contributed">
+ <component name="bmconv_s60" old_model="s60" old_layer="tools" old_package="platformtools" old_collection="gfxconversion" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="iad_rofs" id="iad_rofs" long-name="IAD ROFS" contribution="contributed">
+ <component name="iad_rofs compo" old_model="s60" old_layer="tools" old_package="platformtools" old_collection="iad_rofs" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block name="IDE" tech_domain="to" levels="DD 1 device host cmd-line GUI" level="services" contribution="contributed">
+ <collection name="Connectivity Guides" level="GUI">
+ <component name="Connectivity Solutions Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="FTP and Telnet Daemons Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Generic Unix Protocol Clients" level="host">
+ <component name="FTP Host Client" desktop="yes" license_status="no" source="no" copyright_holder="Microsoft" license="Microsoft" license_type="commercial" platform_optional="yes" reason="Distributed with Windows - open source implementations available" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="excluded"/>
+ <component name="Telnet Host Client" desktop="yes" license_status="no" source="no" copyright_holder="Microsoft" license="Microsoft" license_type="commercial" platform_optional="yes" reason="Distributed with Windows - openm source implementations available" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="excluded"/>
+ </collection>
+ <collection name="Generic Unix Protocols" level="device">
+ <component name="FTP Server" license_status="no" source="no" copyright_holder="Regents of University of California License" license="GPL 2.0 (Bison); Regents of University of California License; Apache 1.1; Apache 2.0; EPL v1" license_type="OSS" comment="Open environment port of ftpd" impl_language="os.oe" plugin="no" old_model="TCL" contribution="available">
+ <unit root="TCL" bldFile="tools/connectivity/ftpd/group" mrp="tools/connectivity/ftpd/group/ftpd.mrp"/>
+ </component>
+ <component name="telnetserver" original-name="Telnet Server" long-name="Telnet Server" license_status="Open" source="yes" license="BSD" license_type="OSS" comment="Also contains binary distributions of Apache Commons; Apache ORO; JUnit." impl_language="os.oe" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="available" copyright_holder="BSD" ship_license="No" partial_contribution="" in_production_device_rom="no" platform_critical="no" source_size="96004">
+ <unit root="TCL" bldFile="tools/connectivity/telnetd/group" mrp="tools/connectivity/telnetd/group/telnetd.mrp"/>
+ </component>
+ <component name="VNC Server" impl_language="os.oe" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Tools DDs" level="DD">
+ <component name="RNDIS DD" source="yes" partial_contribution="yes" license_type="OSS" license_status="yes" license="GPL; Headers for RNDIS come up as forensic matches with Linux distros" impl_language="os" plugin="no" old_model="TCL" contribution="partial">
+ <unit root="TCL" bldFile="tools/connectivity/rndis/group" mrp="tools/connectivity/rndis/group/rndispkt.mrp"/>
+ </component>
+ </collection>
+ <collection name="Java Tools Platform" level="host">
+ <component name="Java compiler" desktop="yes" license_status="no" source="no" license="http://www.java.com/" copyright_holder="Sun Microsystems" license_type="commercial" impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" contribution="excluded"/>
+ <component name="Java runtime" desktop="yes" license_status="no" source="no" license="http://www.java.com/" copyright_holder="Sun Microsystems" license_type="commercial" impl_language="java" external="true" plugin="no" old_model="TCL" contribution="excluded"/>
+ <component name="JUnit" desktop="yes" license_status="no" source="no" license="Common Public License v1.0 (http://www.junit.org/)" copyright_holder="http://www.junit.org/" license_type="OSS" impl_language="java" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="Log4J" desktop="yes" license_status="no" source="no" license="Apache 1.1(http://logging.apache.org/log4j/1.2/index.html)" copyright_holder="http://logging.apache.org/log4j" license_type="OSS" comment="Used by various components; e.g. AURA and CDB" impl_language="java" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="HSQL DB" desktop="yes" license_status="no" source="no" license="http://hsqldb.org/web/hsqlLicense.html" copyright_holder="http://hsqldb.org/" license_type="OSS" impl_language="java" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="Misc 3rd Party" desktop="yes" copyright_holder="Various OSS" license_type="OSS" mcl_component="JAVALIBRARY" impl_language="java" codeline="mcl" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" license_status="Open" ship_license="No" source="yes" license="Apache 1.1 (forensic); GPL 2.0 (forensic); LGPL 2.0 (forensic); LGPL 2.1 (forensic)" partial_contribution="" contribution="available">
+ <unit root="MCL" bldFile="os/ide/javatoolsplatform/misc3rdparty/group" mrp="os/ide/javatoolsplatform/misc3rdparty/group/tools_sdk_eng_javalibrary.mrp"/>
+ </component>
+ </collection>
+ <collection name="Eclipse Platform" level="host">
+ <component name="Platform" desktop="yes" source="no" license_status="no" copyright_holder="Eclipse" license="EPL (http://www.eclipse.org/projects/project_summary.php?projectid=eclipse)" license_type="OSS" impl_language="java.eclipse" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="IDE Eclipse Enablers" level="host">
+ <component name="CDT" desktop="yes" source="no" license_status="no" copyright_holder="Eclipse" license="EPL (http://www.eclipse.org/cdt)" license_type="OSS" impl_language="java.eclipse" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="DSDP-TM" desktop="yes" source="no" license_status="no" copyright_holder="Eclipse" license="EPL (http://www.eclipse.org/dsdp/)" license_type="OSS" impl_language="java.eclipse" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="DSDP-Debug" desktop="yes" source="no" license_status="no" copyright_holder="Eclipse" license="EPL (http://www.eclipse.org/dsdp/)" license_type="OSS" impl_language="java.eclipse" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="RSE Guides" level="GUI">
+ <component name="Symbian RSE Guide" impl_language="data" desktop="yes" codeline="tcl" introduced="Saffron" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Device Management" level="GUI">
+ <component name="VNC Viewer" impl_language="java.eclipse" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Remote Services" level="device">
+ <component name="RSE Services" impl_language="os" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Debug Guides" level="GUI">
+ <component name="Debug Solutions Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Cmd Line Tools" level="cmd-line">
+ <component name="GDB" desktop="yes" source="no" license_type="OSS" license_status="no" copyright_holder="http://sourceware.org/gdb/" license="GPL (http://sourceware.org/gdb/)" impl_language="c.c++" introduced="Saffron" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Debug Agents" level="device">
+ <component name="GDB Agent" license_status="no" license="GPL (http://sourceware.org/gdb/)" license_type="OSS" comment="Will need to make use of some GDB/GNU IP" impl_language="os" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Debug Services" level="device">
+ <component name="Core Dump Server" impl_language="os" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/debug/coredump/group" mrp="tools/debug/coredump/group/coredumpserver.mrp"/>
+ </component>
+ </collection>
+ <collection name="Debug DDs" level="DD">
+ <component name="Core Dump Monitor" impl_language="os" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Codewarrior" level="cmd-line">
+ <component name="Emulator Launcher" desktop="yes" source="no" mcl_component="LAUNCH" comment="Launches the emulator from Codewarrior" impl_language="perl" codeline="mcl" deprecated="Saffron" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" contribution="excluded">
+ <unit root="MCL" bldFile="os/ide/codewarrior/emulatorlauncher/group" mrp="os/ide/codewarrior/emulatorlauncher/group/tools_sdk_eng_launch.mrp"/>
+ </component>
+ </collection>
+ <collection name="Carbide.c++" level="GUI">
+ <component name="Debug Executable" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Freescale" source="no" ship_license_required="yes" copyright_holder="Freescale" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="com.freescale.cdt.debug.cw.core.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Freescale" source="no" ship_license_required="yes" copyright_holder="Freescale" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="com.freescale.cdt.debug.cw.core" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Freescale" source="no" ship_license_required="yes" copyright_holder="Freescale" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="com.freescale.openSourceHeader" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Freescale" source="no" ship_license_required="yes" copyright_holder="Freescale" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="com.freescale.swt" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Freescale" source="no" ship_license_required="yes" copyright_holder="Freescale" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="com.nokia.search.system" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.uidesigner.derived" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.uiq.components" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.sdk.core" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.codescanner" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cppsdk.core" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.support" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.uiq.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.license" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.support" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.trk.support" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.series60.componentlibrary" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.tcf" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.bugreport" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.bugdatacollector" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.capabilityScanner" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cdt.builder.utils" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cdt.builder" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.compiler.cpp.help" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.epoc.engine" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.leavescan" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.project.core" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.project.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.qt.core" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.qt.templates" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.qt.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.sdk.examples" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.sdk.help" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.sdk.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.uiq.help" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp.x86build" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.cpp" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.epocwindDisplay" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.help.common" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.oss" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="GPL" source="yes" ship_license_required="open" copyright_holder="Various" license_status="NOK, contains third party components under GPL. " desktop="yes" foundation="yes" license_type="OSS" contribution="available" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.address" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.button" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.call" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.core" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.function" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.help" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.instr" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.memory" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.power" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.priority" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.priority2" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.util" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi.wizards" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.pi" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.remoteConnections" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.rgml" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.templatewizard" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.carbide.updater" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.cdt.debug.capabilities" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.cdt.debug.crashdebugger" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.cdt.debug.cw.symbian" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.cdt.debug.help" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.cdt.debug.kernelaware" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.cdt.debug.launch" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.cdt.templates" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.emf.dm" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.sourcegen" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.symbian.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.symbian" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.uidesigner.derived" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK, requires legal check" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.uidesigner.help" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.uidesigner" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.uimodel" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.sdt.utils" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.search.system" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK, requires legal check" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.win32.utils" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="S60 Template Wizards" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="LXR Search Extension" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Nokia specific solution" contribution="excluded" old_model="S60Tools"/>
+ <component name="Metadata Editor" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="S60 Template Wizards" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Nokia specific solution" contribution="excluded" old_model="S60Tools"/>
+ </collection>
+ <collection name="TRK" level="1">
+ <component name="dbgtrccomm" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\commontools\trk\dbgtrccomm" source_size="131646.0"/>
+ <component name="TRK group" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="dccdriver" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\commontools\trk\dccdriver" source_size="5447.1"/>
+ <component name="eka2driver" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\commontools\trk\eka2driver" source_size="45073.5"/>
+ <component name="xtidriver" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\commontools\trk\xtidriver" source_size="5182.2"/>
+ <component name="TRK engine" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="TRK app" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="trk" contribution="contributed" old_model="S60Tools"/>
+ <component name="tcbserver" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\commontools\trk\tcbserver" source_size="8760.3"/>
+ <component name="trklauncher" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\commontools\trk\trklauncher" source_size="1731.0"/>
+ </collection>
+ </block>
+ <block name="dynanaltools" long-name="Dynamic Analysis Tools" levels="DD plugins 2 3 cmd-line GUI" tech_domain="to" level="services" contribution="contributed">
+ <collection name="Analysis Viewers" level="GUI">
+ <component name="Sampler Profiler Viewer" impl_language="java.eclipse" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Trace Viewer" impl_language="java.eclipse" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Memory Usage Viewer" desktop="yes" source="yes" partial_contribution="no" license_status="no" license="EPL v1 (seems to re-distribution some Eclipse code snippes and icons; mainly in test code); Apache License Version 2.0 (Apache ActiveMQ)" license_type="OSS" comment="dp/master/debug/traceviewer/.../memusage" impl_language="java.eclipse" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Event Viewer" impl_language="java.eclipse" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Analysis Tools" level="GUI">
+ <component name="commstools" original-name="Comms Tools" long-name="Comms Tools" desktop="yes" mcl_component="Comms Tools" comment="This is the Message Sequence Tool." impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="48404"/>
+ </collection>
+ <collection name="Analysis Workbench" level="GUI">
+ <component name="SAW Installer" impl_language="java.eclipse" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="SAW Workbench" source="yes" partial_contribution="no" license_status="no" license="EPL v1; Apache v2; Common Public License" license_type="OSS" comment="Contains various images and Eclipse distro. Various forensic matches." impl_language="java.eclipse" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Dynamic Analysis Guides" level="GUI">
+ <component name="SAW Workbench Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Trace Solution Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Data Models" level="cmd-line">
+ <component name="Viewer Data Model" impl_language="java.eclipse" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Trace Java Enablers" level="3">
+ <component name="Apache Commons" desktop="yes" source="no" license_type="OSS" copyright_holder="http://commons.apache.org/" license_status="no" license="Apache License v2.0 (http://commons.apache.org/)" comment="Used by Telnet and FTP Server" impl_language="c.c++" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="Apache Oro" desktop="yes" source="no" license_type="OSS" copyright_holder="http://jakarta.apache.org/oro/" license_status="no" license="Apache License v2.0 (http://jakarta.apache.org/oro/)" comment="Used by Telnet and FTP Server" impl_language="java" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="JDOM" desktop="yes" source="no" license_type="OSS" copyright_holder="http://www.jdom.org/" license_status="no" license="Apache License (http://www.jdom.org/)" impl_language="java" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="RxTx" desktop="yes" source="no" license_type="OSS" copyright_holder="http://www.brothersoft.com" license_status="no" license="http://www.brothersoft.com/rxtx-103101.html" impl_language="java" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="JavaMail" desktop="yes" source="no" license_type="OSS" copyright_holder="Sun Microsystems" license_status="no" license="http://java.sun.com/products/javamail/" impl_language="java" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Trace Eclipse Enablers" level="3">
+ <component name="EMF" desktop="yes" source="no" license_type="OSS" license_status="no" copyright_holder="http://www.eclipse.org" license="EPL (http://www.eclipse.org/emf/)" impl_language="java.eclipse" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="TPTP" desktop="yes" source="no" license_type="OSS" license_status="no" copyright_holder="http://www.eclipse.org" license="EPL (http://www.eclipse.org/tptp/)" impl_language="java.eclipse" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ <component name="BIRT" desktop="yes" source="no" license_type="OSS" license_status="no" copyright_holder="http://www.eclipse.org" license="EPL (http://www.eclipse.org/birt/)" impl_language="java.eclipse" external="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Trace Service Plug-ins" level="plugins">
+ <component name="IP Plug-in" impl_language="os" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Serial Plug-in" impl_language="os" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="File Plug-in" impl_language="os" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Trace DDs" level="DD">
+ <component name="Sampler Profiler DD" impl_language="os" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/debug/trace/usampler/group" mrp="tools/debug/trace/usampler/group/tools_sampler_profiler_dd.mrp"/>
+ </component>
+ </collection>
+ <collection name="Performance Tools" level="GUI">
+ <component name="Bappea" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Nokia HW specific. Performance Investigator on carbide.c++ is the general solution" contribution="excluded" old_model="S60Tools"/>
+ <component name="Goofy " tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="no" comment="Old tool to be replaced by Symbian LTC tool called MemSpy" mcl_component="goofy" contribution="excluded" old_model="S60Tools"/>
+ <component name="PerfHooks" long-name="Performance Hooks" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="perfhooks" contribution="contributed" old_model="S60Tools"/>
+ <component name="Performance Investigator" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" comment="What is meant in here? PI is part of carbide.c++" contribution="contributed" old_model="S60Tools"/>
+ <component name="Performance Monitor" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" mcl_component="perfmon" contribution="contributed" old_model="S60Tools"/>
+ <component name="Prism" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="NOK" desktop="no" foundation="no" comment="Old tool will be replaced by Symbian LTC tool called MemSpy" contribution="excluded" old_model="S60Tools"/>
+ <component name="Profiler Activator" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Nokia HW specific solution" contribution="excluded" old_model="S60Tools"/>
+ <component name="SW logic analyzer" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="N/A" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="Memory" level="DD">
+ <component name="Memmon" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" license="S60 OEM R&D" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="no" comment="Old tool which is replaced by PerfMon" mcl_component="memmon" contribution="excluded" old_model="S60Tools"/>
+ <component name="MemSpy" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" license_status="NOK, IPRs by Symbian" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="59094"/>
+ </collection>
+ <collection name="Mobilecrash" level="2">
+ <component name="Mobilecrash - Backend Statistics analysis server" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Nokia solution" contribution="excluded" old_model="S60Tools"/>
+ <component name="Mobilecrash - GPRS gateway and sender application." tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Not in a first phase" contribution="excluded" old_model="S60Tools"/>
+ <component name="Mobilecrash - Hoover" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Old solution" contribution="excluded" old_model="S60Tools"/>
+ <component name="Mobilecrash - PC decoder tool -Selge.exe" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Mobilecrash - SMS gateway and sender application." tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="no" comment="Old solution" contribution="excluded" old_model="S60Tools"/>
+ <component name="Mobilecrash - target code" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="MobileCrash Carbide.c++ Extension" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK, SMS and web servers require legal check. Uses Symbian components." desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="Power" level="plugins">
+ <component name="Nokia Energy Profiler" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="no" comment="Nokia HW dependency" contribution="excluded" old_model="S60Tools"/>
+ </collection>
+ <collection name="Trace" level="3">
+ <component name="OST - Fasttrace" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="OST - Memory trace" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="OST - Memorycard trace" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="OST - Tracebuilder" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="OST - Tracecompiler" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="OST - Tracecore" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK, requires legal check" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="OST - traceviewer" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK, requires legal check" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="OST - USB trace" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Analysis Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="no" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="opensystemtrace" id="opensystemtrace" long-name="Open System Trace" level="2" contribution="contributed">
+ <component name="tracecompiler" old_model="s60" old_layer="tools" old_package="toolsextensions" old_collection="opensystemtrace" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\toolsextensions\opensystemtrace\tracecompiler" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Stubs" tech_domain="hb" level="hw" name="stubs" levels="adaptation plugin mid engine" contribution="contributed">
+ <collection name="audiostubs" id="AudioStubs" long-name="Audio Stubs" level="adaptation" contribution="contributed">
+ <component name="devsoundextensions_stubs" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="AudioStubs" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\AudioStubs\devsoundextensions_stubs" source_size="561274.5"/>
+ <component name="DirectX" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="AudioStubs" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\AudioStubs\DirectX" source_size="684332.4"/>
+ <component name="FMRadioTunerControlStub" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="AudioStubs" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\AudioStubs\FMRadioTunerControlStub" source_size="40090.2"/>
+ </collection>
+ <collection name="drm_stubs" id="drm_stubs" long-name="DRM Stubs" level="plugin" contribution="contributed">
+ <component name="drm_stubs compo" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="drm_stubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\drm_stubs\drm_stubs compo" source_size="0.0"/>
+ </collection>
+ <collection name="licensee_tsy_stub" id="Licensee_Tsy_Stub" long-name="Licensee TSY Stub" level="adaptation" contribution="contributed">
+ <component name="LICENSEETSY_STUB.DLL=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="Licensee_Tsy_Stub" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="yes" path="\s60\adaptation\stubs\Licensee_Tsy_Stub\LICENSEETSY_STUB.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="ptit9core_stub" id="PtiT9Core_stub" long-name="PTI T9 Core Stub" level="plugin" contribution="excluded" source="no" copyright_holder="Nuance" license="S60 OEM R&D" license_status="no" license_type="commercial" comment="Emulator binaries for T9. Compiled PtiT9Core with Nuance WINS binaries. Arm binaries are needed for the Foundation.">
+ <component name="ptit9core_stub compo" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="PtiT9Core_stub" comment="Emulator binaries for T9. Compiled PtiT9Core with Nuance WINS binaries. Arm binaries are needed for the Foundation." contribution="excluded" source="no" copyright_holder="Nuance" license="S60 OEM R&D" license_status="no" license_type="commercial"/>
+ </collection>
+ <collection name="simatk_tsy_stub" id="SIMATK_TSY_Stub" long-name="SIMATK TSY Stub" level="adaptation" contribution="contributed">
+ <component name="SIMATKTSY_STUB.dll=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="SIMATK_TSY_Stub" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="yes" path="\s60\adaptation\stubs\SIMATK_TSY_Stub\SIMATKTSY_STUB.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="btaudioadaptation_stub" id="btaudioadaptation_stub" long-name="BT Audio Adaptation Stub" level="adaptation" contribution="contributed">
+ <component name="btaudioadaptation_stub.dll=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="btaudioadaptation_stub" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\btaudioadaptation_stub\btaudioadaptation_stub.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="btpm_stub" id="btpm_stub" long-name="BT PM Stub" level="adaptation" contribution="contributed">
+ <component name="btpm.dll=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="btpm_stub" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\btpm_stub\btpm.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="posmsgpluginreferenceimpl" id="posmsgpluginreferenceimpl" long-name="Pos Msg Plugin Reference Implementation" level="plugin" contribution="contributed">
+ <component name="eposomasuplposrefapp.dll=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="posmsgpluginreferenceimpl" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\posmsgpluginreferenceimpl\eposomasuplposrefapp.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="power_save_display_mode_stub" id="power_save_display_mode_stub" long-name="Power Save Display Mode Stub" level="plugin" contribution="contributed" in_production_device_rom="no">
+ <component name="power_save_display_mode_stub.dll=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="power_save_display_mode_stub" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\power_save_display_mode_stub\power_save_display_mode_stub.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="srsfenginestub" id="srsfenginestub" long-name="SRSF Engine Stub" level="engine" contribution="contributed" in_production_device_rom="no">
+ <component name="adaptationhwdevice" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="srsfenginestub" comment="" contribution="contributed" in_production_device_rom="no" not_used_by_s60="" path="\s60\adaptation\stubs\srsfenginestub\adaptationhwdevice" source_size="155333.1"/>
+ <component name="grcompilerhwdevice" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="srsfenginestub" comment="" contribution="contributed" in_production_device_rom="no" not_used_by_s60="" path="\s60\adaptation\stubs\srsfenginestub\grcompilerhwdevice" source_size="190670.1"/>
+ <component name="TtpHwDevice" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="srsfenginestub" comment="" contribution="contributed" in_production_device_rom="no" not_used_by_s60="" path="\s60\adaptation\stubs\srsfenginestub\TtpHwDevice" source_size="223696.2"/>
+ <component name="RecognitionHwDevice" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="srsfenginestub" comment="" contribution="contributed" in_production_device_rom="no" not_used_by_s60="" path="\s60\adaptation\stubs\srsfenginestub\RecognitionHwDevice" source_size="283733.4"/>
+ <component name="VocManHwDevice" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="srsfenginestub" comment="" contribution="contributed" in_production_device_rom="no" not_used_by_s60="" path="\s60\adaptation\stubs\srsfenginestub\VocManHwDevice" source_size="152079.6"/>
+ <component name="TtsHwDevice" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="srsfenginestub" comment="" contribution="contributed" in_production_device_rom="no" not_used_by_s60="" path="\s60\adaptation\stubs\srsfenginestub\TtsHwDevice" source_size="250646.7"/>
+ <component name="NlpHwDevice" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="srsfenginestub" comment="" contribution="contributed" in_production_device_rom="no" not_used_by_s60="" path="\s60\adaptation\stubs\srsfenginestub\NlpHwDevice" source_size="4532.7"/>
+ </collection>
+ <collection name="systemswstubs" id="systemswstubs" long-name="System SW Stubs" level="adaptation" contribution="contributed">
+ <component name="accessorypolicyreference" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\accessorypolicyreference" source_size="171803.1"/>
+ <component name="asyreference" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\asyreference" source_size="46678.5"/>
+ <component name="examplecommonisc" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="yes" path="\s60\adaptation\stubs\systemswstubs\examplecommonisc" source_size="631715.7"/>
+ <component name="exampledsy" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\exampledsy" source_size="60177.3"/>
+ <component name="featuremanagerstub" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\featuremanagerstub" source_size="33832.2"/>
+ <component name="hwrmhapticsstubplugin" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed"/>
+ <component name="hwrmstubplugins" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\hwrmstubplugins" source_size="93414.3"/>
+ <component name="licenseedsystub" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\licenseedsystub" source_size="42271.2"/>
+ <component name="sensorchannelsreference" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\sensorchannelsreference" source_size="29009.7"/>
+ <component name="ssyreference" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\ssyreference" source_size="286385.4"/>
+ <component name="startupadaptationstub" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\startupadaptationstub" source_size="50549.7"/>
+ <component name="tiltcompensationstub" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed"/>
+ <component name="TVOutConfig" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\TVOutConfig" source_size="30993.0"/>
+ <component name="wiredbearerreference" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="systemswstubs" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\adaptation\stubs\systemswstubs\wiredbearerreference" source_size="39651.9"/>
+ </collection>
+ <collection name="tactileclickplugin_stub" id="tactileclickplugin_stub" long-name="Tactile Click Plugin Stub" level="engine" contribution="contributed" in_production_device_rom="no">
+ <component name="tactileclickplugin.dll=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="tactileclickplugin_stub" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\tactileclickplugin_stub\tactileclickplugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wlanhwinit_stub" id="wlanhwinit_stub" long-name="WLAN Hardware Init Stub" level="mid" contribution="contributed">
+ <component name="wlanhwinit.dll=binary" old_model="s60" old_layer="adaptation" old_package="stubs" old_collection="wlanhwinit_stub" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\adaptation\stubs\wlanhwinit_stub\wlanhwinit.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block name="deviceplatformrelease" levels="bld mid top" contribution="contributed" long-name="Device Platform Release" tech_domain="to" level="services">
+ <collection name="GT Baseline" level="top" contribution="contributed">
+ <component name="gttechviewbaseline" original-name="GT Techview Baseline" long-name="GT Techview Baseline" plugin="no" old_model="TCL" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="7320"> <unit mrp="os/deviceplatformrelease/gtbaseline/gttechviewbaseline/gt_techview_baseline.mrp"/>
+ </component>
+ </collection>
+ <collection name="Nokia" id="Nokia" long-name="Nokia" level="top" contribution="contributed">
+ <component name="Nokia compo" old_model="s60" old_layer="misc" old_package="release" old_collection="Nokia" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\misc\release\Nokia\Nokia compo" source_size="0.0"/>
+ </collection>
+ <collection name="S60Extras" id="S60Extras" long-name="S60 Extras" level="mid" contribution="contributed">
+ <component name="S60Extras compo" old_model="s60" old_layer="misc" old_package="release" old_collection="S60Extras" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\misc\release\S60Extras\S60Extras compo" source_size="0.0"/>
+ </collection>
+ <collection name="S60Helps" id="S60Helps" long-name="S60 Helps" level="mid" contribution="contributed">
+ <component name="S60Helps compo" old_model="s60" old_layer="misc" old_package="release" old_collection="S60Helps" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\misc\release\S60Helps\S60Helps compo" source_size="0.0"/>
+ </collection>
+ <collection name="S60LocFiles" id="S60LocFiles" long-name="S60 Loc Files" level="mid" contribution="contributed">
+ <component name="S60LocFiles compo" old_model="s60" old_layer="misc" old_package="release" old_collection="S60LocFiles" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\misc\release\S60LocFiles\S60LocFiles compo" source_size="0.0"/>
+ </collection>
+ <collection name="Version" id="Version" long-name="Version" level="top" contribution="contributed">
+ <component name="Version compo" old_model="s60" old_layer="misc" old_package="release" old_collection="Version" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\misc\release\Version\Version compo" source_size="0.0"/>
+ </collection>
+ </block>
+ <block name="unref">
+ <collection name="unrefcol">
+ <component name="testtools_cts_functionalitycheckers" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::CTS Functionality Checkers">
+ <unit mrp="os/unref/comtt/cts/FunctionalityCheckers/Group/testtools_cts_functionalitycheckers.mrp"/>
+ </component>
+ <component name="tools_cbr_tools" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::CBRTOOLS">
+ <unit bldFile="os/unref/comgen/tools/cbr/tools/group" mrp="os/unref/comgen/tools/cbr/tools/group/tools_cbr_tools.mrp"/>
+ </component>
+ <component name="testtools_cdb" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::CDB">
+ <unit bldFile="os/unref/comtt/cdb/group" mrp="os/unref/comtt/cdb/group/testtools_cdb.mrp"/>
+ </component>
+ <component name="tools_evalid" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::EVALID">
+ <unit bldFile="os/unref/comgen/tools/host_utilities/evalid" mrp="os/unref/comgen/tools/host_utilities/evalid/tools_evalid.mrp"/>
+ </component>
+ <component name="testtools_cts_kitcomparator" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::KITCOMPARATOR">
+ <unit bldFile="os/unref/comtt/cts/kitcomparator/group" mrp="os/unref/comtt/cts/kitcomparator/group/testtools_cts_kitcomparator.mrp"/>
+ </component>
+ <component name="testtools_stat_device_gt" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::Stat API">
+ <unit bldFile="os/unref/comtt/stat/device/source/statapi/console" mrp="os/unref/comtt/stat/device/group/testtools_stat_device_gt.mrp"/>
+ </component>
+ <component name="testtools_stat_common_source" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::Stat Source">
+ <unit mrp="os/unref/comtt/stat/group/testtools_stat_common_source.mrp"/>
+ </component>
+ <component name="testtools_stat_desktop" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::STAT_DESKTOP">
+ <unit bldFile="os/unref/comtt/stat/desktop/group" mrp="os/unref/comtt/stat/desktop/group/testtools_stat_desktop.mrp"/>
+ </component>
+ <component name="tools_testexecute" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::TESTEXECUTE">
+ <unit bldFile="os/unref/comtt/testexecute/Group" mrp="os/unref/comtt/testexecute/Group/tools_testexecute.mrp"/>
+ </component>
+ <component name="testtools_WinTunnel_srconly" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::Wintunnel">
+ <unit mrp="os/unref/comtt/wintunnel/group/testtools_WinTunnel_srconly.mrp"/>
+ </component>
+ <component name="tools_autotest" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::AUTOTEST">
+ <unit bldFile="os/unref/comgen/tools/autotest/group" mrp="os/unref/comgen/tools/autotest/group/tools_autotest.mrp"/>
+ </component>
+ <component name="tools_testconfigfileparser" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::TESTCONFIGFILEPARSER">
+ <unit bldFile="os/unref/comgen/tools/testconfigfileparser/group" mrp="os/unref/comgen/tools/testconfigfileparser/group/tools_testconfigfileparser.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_NavigationPages" long-name="Tools and Utils and SDKENG::Misc::Tools and Utils::NAVIGATION_PAGES">
+ <unit mrp="os/unref/comgen/tools/sdk_eng/NavigationPages/tools_sdk_eng_NavigationPages.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_runperl" long-name="Tools and Utils and SDKENG::Misc::SDKENG::RUNPERL">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/runperl/group" mrp="os/unref/comgen/tools/sdk_eng/runperl/group/tools_sdk_eng_runperl.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_assertion" long-name="Tools and Utils and SDKENG::Misc::SDKENG::ASSERTION">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/assertion/group" mrp="os/unref/comgen/tools/sdk_eng/assertion/group/tools_sdk_eng_assertion.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_enum" long-name="Tools and Utils and SDKENG::Misc::SDKENG::ENUM">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/enum/group" mrp="os/unref/comgen/tools/sdk_eng/enum/group/tools_sdk_eng_enum.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_logger" long-name="Tools and Utils and SDKENG::Misc::SDKENG::LOGGER">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/logger/group" mrp="os/unref/comgen/tools/sdk_eng/logger/group/tools_sdk_eng_logger.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_filesys" long-name="Tools and Utils and SDKENG::Misc::SDKENG::FILESYS">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/filesys/group" mrp="os/unref/comgen/tools/sdk_eng/filesys/group/tools_sdk_eng_filesys.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_envvar" long-name="Tools and Utils and SDKENG::Misc::SDKENG::ENVVAR">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/envvar/group" mrp="os/unref/comgen/tools/sdk_eng/envvar/group/tools_sdk_eng_envvar.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_installutils" long-name="Tools and Utils and SDKENG::Misc::SDKENG::INSTALLUTILS">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/installutils/group" mrp="os/unref/comgen/tools/sdk_eng/installutils/group/tools_sdk_eng_installutils.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_mnemonicfix" long-name="Tools and Utils and SDKENG::Misc::SDKENG::MNEMONICFIX">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/mnemonicfix/group" mrp="os/unref/comgen/tools/sdk_eng/mnemonicfix/group/tools_sdk_eng_mnemonicfix.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_pathbrowser" long-name="Tools and Utils and SDKENG::Misc::SDKENG::PATHBROWSER">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/pathbrowser/group" mrp="os/unref/comgen/tools/sdk_eng/pathbrowser/group/tools_sdk_eng_pathbrowser.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_shellexec" long-name="Tools and Utils and SDKENG::Misc::SDKENG::SHELLEXEC">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/shellexec/group" mrp="os/unref/comgen/tools/sdk_eng/shellexec/group/tools_sdk_eng_shellexec.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_swingworker" long-name="Tools and Utils and SDKENG::Misc::SDKENG::SWINGWORKER">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/swingworker/group" mrp="os/unref/comgen/tools/sdk_eng/swingworker/group/tools_sdk_eng_swingworker.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_testcaserunner" long-name="Tools and Utils and SDKENG::Misc::SDKENG::TESTCASERUNNER">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/testcaserunner/group" mrp="os/unref/comgen/tools/sdk_eng/testcaserunner/group/tools_sdk_eng_testcaserunner.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_toolbarpanel" long-name="Tools and Utils and SDKENG::Misc::SDKENG::TOOLBARPANEL">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/toolbarpanel/group" mrp="os/unref/comgen/tools/sdk_eng/toolbarpanel/group/tools_sdk_eng_toolbarpanel.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_javahelp" long-name="Tools and Utils and SDKENG::Misc::SDKENG::JAVAHELP">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/javahelp/group" mrp="os/unref/comgen/tools/sdk_eng/javahelp/group/tools_sdk_eng_javahelp.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_langconfig" long-name="Tools and Utils and SDKENG::Misc::SDKENG::LANGCONFIG">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/langconfig/group" mrp="os/unref/comgen/tools/sdk_eng/langconfig/group/tools_sdk_eng_langconfig.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_jade" long-name="Tools and Utils and SDKENG::Misc::SDKENG::JADE">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/jade/group" mrp="os/unref/comgen/tools/sdk_eng/jade/group/tools_sdk_eng_jade.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_cshlpcmp_gui" long-name="Tools and Utils and SDKENG::Misc::SDKENG::CSHLPCMP_GUI">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/cshlpcmp_gui/group" mrp="os/unref/comgen/tools/sdk_eng/cshlpcmp_gui/group/tools_sdk_eng_cshlpcmp_gui.mrp" priority="1010"/>
+ </component>
+ <component name="tools_sdk_eng_sdkpkg-manager" long-name="Tools and Utils and SDKENG::Misc::SDKENG::SDK Package Manager">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/sdkpkg-manager/group" mrp="os/unref/comgen/tools/sdk_eng/sdkpkg-manager/group/tools_sdk_eng_sdkpkg-manager.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_emulator_launcher" long-name="Tools and Utils and SDKENG::Misc::SDKENG::EMULATOR_LAUNCHER">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/emulator_launcher/group" mrp="os/unref/comgen/tools/sdk_eng/emulator_launcher/group/tools_sdk_eng_emulator_launcher.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_pkgmgrgui" long-name="Tools and Utils and SDKENG::Misc::SDKENG::PKGMGRGUI">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/pkgmgrgui/group" mrp="os/unref/comgen/tools/sdk_eng/pkgmgrgui/group/tools_sdk_eng_pkgmgrgui.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_alp2csh" long-name="Tools and Utils and SDKENG::Misc::SDKENG::ALP2CSH">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/alp2csh/group" mrp="os/unref/comgen/tools/sdk_eng/alp2csh/group/tools_sdk_eng_alp2csh.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_cshlpcmp_frontend" long-name="Tools and Utils and SDKENG::Misc::SDKENG::CSHLPCMP Frontend">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/cshlpcmp_frontend/group" mrp="os/unref/comgen/tools/sdk_eng/cshlpcmp_frontend/group/tools_sdk_eng_cshlpcmp_frontend.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_cshlpcmp_backend_srconly" long-name="Tools and Utils and SDKENG::Misc::SDKENG::CSHLPCMP Backend">
+ <unit mrp="os/unref/comgen/tools/sdk_eng/cshlpcmp_backend/group/tools_sdk_eng_cshlpcmp_backend_srconly.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_perllibrary" long-name="Tools and Utils and SDKENG::Misc::SDKENG::PERLLIBRARY">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/perllibrary/group" mrp="os/unref/comgen/tools/sdk_eng/perllibrary/group/tools_sdk_eng_perllibrary.mrp"/>
+ </component>
+ <component name="tools_sdk_eng_sdk_builder" long-name="Tools and Utils and SDKENG::Misc::SDKENG::SDK Builder">
+ <unit bldFile="os/unref/comgen/tools/sdk_eng/SDK_Builder/group" mrp="os/unref/comgen/tools/sdk_eng/SDK_Builder/group/tools_sdk_eng_sdk_builder.mrp"/>
+ </component>
+ <component name="bluetooth_testproduct" long-name="Tools and Utils and SDKENG::Misc::Test Product::Bluetooth Test Product">
+ <unit mrp="os/unref/comgen/bluetooth/latest/testproduct/group/bluetooth_testproduct.mrp"/>
+ </component>
+ <component name="multimedia_testproduct" long-name="Tools and Utils and SDKENG::Misc::Test Product::Multimedia Test Product">
+ <unit mrp="os/unref/comgen/multimedia/testproduct/group/multimedia_testproduct.mrp"/>
+ </component>
+ <component name="syslibs_testproduct" long-name="Tools and Utils and SDKENG::Misc::Test Product::Syslibs Test Product">
+ <unit mrp="os/unref/comgen/syslibs/testproduct/group/syslibs_testproduct.mrp"/>
+ </component>
+ <component name="comms-infras_testproduct" long-name="Tools and Utils and SDKENG::Misc::Test Product::Comms Infrastructure Test Product">
+ <unit mrp="os/unref/comgen/comms-infras/testproduct/group/comms-infras_testproduct.mrp"/>
+ </component>
+ <component name="graphics_testproduct" long-name="Tools and Utils and SDKENG::Misc::Test Product::Graphics Test Product">
+ <unit mrp="os/unref/comgen/graphics/testproduct/group/graphics_testproduct.mrp"/>
+ </component>
+ <component name="base_template" long-name="HAL::Board Support Packages::Generic BSP::Template Variant">
+ <unit bldFile="os/unref/cedgen/base/template/template_variant" mrp="os/unref/cedgen/base/template/base_template.mrp"/>
+ </component>
+ <component name="app-engines_agnmodel" long-name="Application Services::PIM::PIM App Services::Agenda Model">
+ <unit bldFile="os/unref/comgen/app-engines/agnmodel/group" mrp="os/unref/comgen/app-engines/agnmodel/group/app-engines_agnmodel.mrp"/>
+ </component>
+ <component name="app-engines_agnversit" long-name="Application Services::PIM::PIM App Services::Agenda Versit Plugin">
+ <unit version="1" bldFile="os/unref/comgen/app-engines/agnversit/group" mrp="os/unref/comgen/app-engines/agnversit/group/app-engines_agnversit.mrp"/>
+ </component>
+ <component name="graphics_memspy" long-name="UI::Techview::Apps::MemSpy">
+ <unit bldFile="os/unref/comgen/graphics/testutils/memspy/group" mrp="os/unref/comgen/graphics/testutils/memspy/group/graphics_memspy.mrp"/>
+ </component>
+ <component name="app-engines_testagendasrv" long-name="MISC::Misc::Applications Test::Agenda Model Test">
+ <unit bldFile="os/unref/comgen/app-engines/test_engineering/agendaserver/TestAgendaSrv" mrp="os/unref/comgen/app-engines/test_engineering/agendaserver/TestAgendaSrv/app-engines_testagendasrv.mrp"/>
+ </component>
+ <component name="additional_dummy" long-name="MISC::Misc::Miscellaneous::DUMMY">
+ <unit bldFile="os/unref/comgen/tools/cbr/dummy" mrp="os/unref/comgen/tools/cbr/dummy/additional_dummy.mrp"/>
+ </component>
+ <component name="testtools_systemmonitor" long-name="MISC::Misc::Miscellaneous::SYSTEMMONITOR">
+ <unit bldFile="os/unref/comtt/systemmonitor/group" mrp="os/unref/comtt/systemmonitor/group/testtools_systemmonitor.mrp"/>
+ </component>
+ <component name="testtools_utilities" long-name="MISC::Misc::Miscellaneous::TESTTOOLS_UTILITIES">
+ <unit bldFile="os/unref/comtt/utilities/group" mrp="os/unref/comtt/utilities/group/testtools_utilities.mrp"/>
+ </component>
+ </collection>
+ </block>
+ </layer>
+ <layer name="mw" long-name="Middleware" levels="1 2" contribution="contributed">
+ <block long-name="Generic Application Support" tech_domain="rt" level="1" name="appsupport" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="sysresmonitoring" id="oodmonitor" long-name="OOD Monitor" level="plugin" contribution="contributed">
+ <component name="" old_model="Foundation" contribution="contributed"/>
+ <component name="oodmonitor2" old_model="s60" old_layer="mw" old_package="appexts" old_collection="oodmonitor" comment="This subsystem is actually a component so move it to component level." contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\appexts\oodmonitor\oodmonitor2" source_size="311724.9"/>
+ <component name="oommonitor.dll=binary" old_model="s60" old_layer="mw" old_package="appexts" old_collection="oommonitor" comment="This subsystem is actually a component so move it to component level." contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\appexts\oommonitor\oommonitor.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="gssettingsuis" id="settingsuis" long-name="GS Settings UIs" level="specific" contribution="contributed">
+ <component name="Gs" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="settingsuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\settingsuis\Gs" source_size="4593435.6"/>
+ </collection>
+ <collection name="profilesservices" id="profilesservices" long-name="Profiles Services" level="server" contribution="contributed">
+ <component name="FileList" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="profilesservices" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\profile\profilesapplication\FileList" source_size="1999836.3"/>
+ <component name="MediaFileList" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="profilesservices" comment="" contribution="contributed"/>
+ <component name="ProfileEngine" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="profilesservices" comment="" contribution="contributed"/>
+ <component name="RingingTone3DPlugin" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="profilesservices" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="flashliteapi_3_0" id="flashliteapi_3_0" long-name="Flashlite API 3.0" level="specific" contribution="contributed">
+ <component name="flashliteapi_3_0 compo" old_model="s60" old_layer="mw" old_package="flashapi" old_collection="flashliteapi_3_0" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\flashapi\flashliteapi_3_0\flashliteapi_3_0 compo" source_size="0.0"/>
+ </collection>
+ <collection name="contextframework" id="ContextFramework" long-name="Context Framework" level="framework" contribution="contributed">
+ <component name="cfw" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="ContextFramework" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\ContextFramework\cfw" source_size="2368071.9"/>
+ <component name="cfwplugins" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="ContextFramework" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\ContextFramework\cfwplugins" source_size="1558059.9"/>
+ </collection>
+ <collection name="mediakeys" id="MediaKeys" long-name="Media Keys" level="plugin" contribution="contributed">
+ <component name="KeyPublisherPlugin" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="MediaKeys" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\MediaKeys\KeyPublisherPlugin" source_size="8490.3"/>
+ <component name="MMKeyBearer" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="MediaKeys" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\MediaKeys\MMKeyBearer" source_size="27770.1"/>
+ </collection>
+ <collection name="coreapplicationuis" id="coreapplicationuis" long-name="Core Application UIs" level="server" contribution="contributed">
+ <component name="accfwuinotifier" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\accfwuinotifier" source_size="846813.0"/>
+ <component name="advancedtspcontroller" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\advancedtspcontroller" source_size="780045.0"/>
+ <component name="DbRecovery" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\DbRecovery" source_size="32773.5"/>
+ <component name="GSServer" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed"/>
+ <component name="GSServerEngine" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed"/>
+ <component name="kefmapper" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\kefmapper" source_size="558506.1"/>
+ <component name="NspsWsPlugin" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\NspsWsPlugin" source_size="32643.3"/>
+ <component name="powersaveutilities" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed"/>
+ <component name="Rfs" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\Rfs" source_size="476090.4"/>
+ <component name="rfsplugins" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\rfsplugins" source_size="235062.3"/>
+ <component name="SysAp" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\SysAp" source_size="1722646.2"/>
+ <component name="VariatedSettings" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\VariatedSettings" source_size="28304.1"/>
+ </collection>
+ <collection name="startupservices" id="startupservices" long-name="Startup Services" level="plugin" contribution="contributed">
+ <component name="SplashScreen" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="startupservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\startupservices\SplashScreen" source_size="37603.2"/>
+ <component name="Startup" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="startupservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\systemswservices\startupservices\Startup" source_size="2084165.7"/>
+ <component name="startupanimation" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="startupservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\startupservices\startupanimation" source_size="1140055.5"/>
+ </collection>
+ <collection name="systemsettings" id="systemsettings" long-name="System Settings" level="plugin" contribution="contributed">
+ <component name="GSAccessoryPlugin" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="systemsettings" comment="" contribution="contributed"/>
+ <component name="gssensorplugin" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="systemsettings" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\systemsettings\gssensorplugin" source_size="2047763.4"/>
+ </collection>
+ <collection name="filehandling" original-name="File Handling" long-name="File Handling" id="File Handling" level="server" contribution="contributed">
+ <component name="fileconverterfw" original-name="File Converter Framework" long-name="File Converter Framework" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="File Handling" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="390230">
+ <unit bldFile="mw/appsupport/filehandling/fileconverterfw/group" mrp="mw/appsupport/filehandling/fileconverterfw/group/app-framework_conarc.mrp"/>
+ </component>
+ <component name="fileconverterplugins" original-name="Other File Converter Plugins" long-name="Other File Converter Plugins" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="File Handling" comment="" plugin="Y" introduced="5.0" deprecated="9.3" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="mw/appsupport/filehandling/fileconverterplugins/group/app-engines_convert.mrp" bldFile="mw/appsupport/filehandling/fileconverterplugins/group"/>
+ </component>
+ <component name="htmltorichtextconverter" original-name="HTML to RichText Converter" long-name="HTML to RichText Converter" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="File Handling" comment="" plugin="Y" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="170646">
+ <unit bldFile="mw/appsupport/filehandling/htmltorichtextconverter/group" mrp="mw/appsupport/filehandling/htmltorichtextconverter/group/app-services_chtmltocrtconv.mrp"/>
+ </component>
+ <component name="richtexttohtmlconverter" original-name="RichText to HTML Converter" long-name="RichText to HTML Converter" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="File Handling" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="24299">
+ <unit bldFile="mw/appsupport/filehandling/richtexttohtmlconverter/Group" mrp="mw/appsupport/filehandling/richtexttohtmlconverter/Group/app-services_richtexttohtmlconv.mrp"/>
+ </component>
+ </collection>
+ <collection name="sensorsupport" original-name="Sensor Support" long-name="Sensor Support" id="Sensor Support" level="generic" contribution="contributed">
+ <component name="testsensor" original-name="Test Sensor" long-name="Test Sensor" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Sensor Support" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="no" source_size="43195">
+ <unit bldFile="os/unref/orphan/comgen/syslibs/sensors/ssyreference/group" mrp="os/unref/orphan/comgen/syslibs/sensors/ssyreference/group/syslibs_sensors_ssyreference.mrp"/>
+ </component>
+ </collection>
+ <collection name="hardwareresourceadaptation" original-name="Hardware Resource Adaptation" long-name="Hardware Resource Adaptation" id="Hardware Resource Adaptation" level="generic" contribution="contributed">
+ <component name="hardwareresourcemgruiplugin" original-name="Hardware Resource Manager UI Plugin" long-name="Hardware Resource Manager UI Plugin" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Hardware Resource Adaptation" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="yes" source_size="5810">
+ <unit bldFile="os/devicesrv/resourcemgmt/hardwareresourcesmgr/uiplugin/group" mrp="os/devicesrv/resourcemgmt/hardwareresourcesmgr/uiplugin/group/telephony_hwrmuiplugin.mrp"/>
+ </component>
+ </collection>
+ <collection name="commonappservices" original-name="Common Application Services" long-name="Common Application Services" id="Common Application Services" level="framework" contribution="contributed">
+ <component name="alarmserver" original-name="Alarm Server" long-name="Alarm Server" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Common Application Services" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="650768">
+ <unit bldFile="mw/appsupport/commonappservices/alarmserver/Group" mrp="mw/appsupport/commonappservices/alarmserver/Group/app-services_alarmserver.mrp"/>
+ </component>
+ <component name="alarmservertest" original-name="Alarm Server Test" long-name="Alarm Server Test" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Common Application Services" comment="" class="test" introduced="8.1" deprecated="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="336389">
+ <unit bldFile="mw/appsupport/commonappservices/alarmservertest/TestAlarmSrv" mrp="mw/appsupport/commonappservices/alarmservertest/TestAlarmSrv/app-services_testalarmsrv.mrp"/>
+ </component>
+ <component name="coreappstest" original-name="Core Apps Test" long-name="Core Apps Test" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Common Application Services" comment="" class="test" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="26715">
+ <unit mrp="mw/appsupport/commonappservices/coreappstest/Group/app-services_CoreAppsTest.mrp"/>
+ </component>
+ <component name="appservicesdocs" original-name="Application Services Documentation" long-name="Application Services Documentation" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Common Application Services" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="853214">
+ <unit mrp="mw/appsupport/commonappservices/appservicesdocs/app-services_documentation.mrp"/>
+ </component>
+ <component name="backuprestorenotification" original-name="Backup Restore Notification" long-name="Backup Restore Notification" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Common Application Services" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="19518">
+ <unit bldFile="mw/appsupport/commonappservices/backuprestorenotification/group" mrp="mw/appsupport/commonappservices/backuprestorenotification/group/app-services_BackupRestoreNotification.mrp"/>
+ </component>
+ </collection>
+ <collection name="tzservices" original-name="Time Zone Services" long-name="Time Zone Services" id="Time Zone Services" level="plugin" contribution="contributed">
+ <component name="tzserver" original-name="Time Zone Server" long-name="Time Zone Server" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Time Zone Services" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="985722">
+ <unit bldFile="mw/appsupport/tzservices/tzserver/group" mrp="mw/appsupport/tzservices/tzserver/group/app-services_tz.mrp"/>
+ </component>
+ <component name="tzlocalization" original-name="Time Zone Localization" long-name="Time Zone Localization" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Time Zone Services" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="350025">
+ <unit bldFile="mw/appsupport/tzservices/tzlocalization/group" mrp="mw/appsupport/tzservices/tzlocalization/group/app-services_timezonelocalization.mrp"/>
+ </component>
+ <component name="tzlocalizationrscfactory" original-name="Time Zone Localization Resource Factory" long-name="Time Zone Localization Resource Factory" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Time Zone Services" comment="" class="config" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="44689">
+ <unit bldFile="mw/appsupport/tzservices/tzlocalizationrscfactory/group" mrp="mw/appsupport/tzservices/tzlocalizationrscfactory/group/app-services_tzlocalizationrscfactory.mrp"/>
+ </component>
+ <component name="tzdatabase" original-name="Time Zone Database" long-name="Time Zone Database" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Time Zone Services" comment="" class="config" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="82272">
+ <unit bldFile="mw/appsupport/tzservices/tzdatabase/group" mrp="mw/appsupport/tzservices/tzdatabase/group/app-services_tzdb.mrp"/>
+ </component>
+ <component name="worldserver" original-name="World Server" long-name="World Server" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Time Zone Services" comment="" introduced="7.0" deprecated="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="229089">
+ <unit bldFile="mw/appsupport/tzservices/worldserver/group" mrp="mw/appsupport/tzservices/worldserver/group/app-services_worldserver.mrp"/>
+ </component>
+ <component name="worldservertest" original-name="World Server Test" long-name="World Server Test" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Time Zone Services" comment="" class="test" introduced="8.1" deprecated="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="85607">
+ <unit bldFile="mw/appsupport/tzservices/worldservertest/TestWorldSrv" mrp="mw/appsupport/tzservices/worldservertest/TestWorldSrv/app-services_testworldsrv.mrp"/>
+ </component>
+ </collection>
+ <collection name="contenthandling" original-name="Content Handling" long-name="Content Handling" id="Content Handling" level="plugin" contribution="contributed">
+ <component name="contenthandlingfw" original-name="Content Handling Framework" long-name="Content Handling Framework" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Content Handling" comment="" introduced="8.0" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="mw/appsupport/contenthandling/contenthandlingfw/Group/content-handling.mrp" bldFile="mw/appsupport/contenthandling/contenthandlingfw/Group"/>
+ </component>
+ <component name="webrecognisers" original-name="Web Recognisers" long-name="Web Recognisers" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Content Handling" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="120559">
+ <unit bldFile="mw/appsupport/contenthandling/webrecognisers/group" mrp="mw/appsupport/contenthandling/webrecognisers/group/application-protocols_recognisers.mrp"/>
+ </component>
+ <component name="referencedrmagent" original-name="Reference DRM Agent" long-name="Reference DRM Agent" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Content Handling" comment="" introduced="8.0" contribution="contributed" not_used_by_s60="yes" in_production_device_rom="no" platform_critical="no" source_size="0">
+ <unit bldFile="mw/appsupport/contenthandling/referencedrmagent/RefTestAgent/group" mrp="mw/appsupport/contenthandling/referencedrmagent/RefTestAgent/group/security_rta.mrp"/>
+ </component>
+ <component name="cafstreamingsupport" original-name="CAF Streaming Support" long-name="CAF Streaming Support" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Content Handling" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="133949">
+ <unit bldFile="os/security/contentmgmt/contentaccessfwfordrm/streaming/group" mrp="os/security/contentmgmt/contentaccessfwfordrm/streaming/group/security_streamingcaf.mrp"/>
+ </component>
+ </collection>
+ <collection name="openenvutils" original-name="Open Environment Utilities" long-name="Open Environment Utilities" id="Open Environment Utilities" level="specific" contribution="contributed">
+ <component name="commandshell" original-name="Command Shell" long-name="Command Shell" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Open Environment Utilities" comment="" introduced="9.5" contribution="available" not_used_by_s60="" export_restricted="no" license_type="OSS" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" partial_contribution="" license="BSD 2.0; Various OSS (Unknown - possibly BSD variants)" in_production_device_rom="no" platform_critical="no" source_size="989307">
+ <unit bldFile="os/unref/orphan/comgen/openenv/oetools/zsh/group" mrp="os/unref/orphan/comgen/openenv/oetools/zsh/group/oetools_zsh.mrp"/>
+ </component>
+ </collection>
+ <collection name="printingsupport" original-name="Printing Support" long-name="Printing Support" id="Printing Support" level="generic" contribution="contributed">
+ <component name="printinguisupport" original-name="Printing UI Support" long-name="Printing UI Support" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Printing Support" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="81845">
+ <unit bldFile="mw/appsupport/printingsupport/printinguisupport/group" mrp="mw/appsupport/printingsupport/printinguisupport/group/app-framework_print.mrp"/>
+ </component>
+ </collection>
+ <collection name="appfw" original-name="Application Framework" long-name="Application Framework" id="Application Framework" level="framework" contribution="contributed">
+ <component name="apparchitecture" original-name="Application Architecture" long-name="Application Architecture" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Application Framework" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1090102">
+ <unit bldFile="mw/appsupport/appfw/apparchitecture/group" mrp="mw/appsupport/appfw/apparchitecture/group/app-framework_apparc.mrp"/>
+ </component>
+ <component name="viewserver" original-name="View Server" long-name="View Server" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Application Framework" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="145640">
+ <unit bldFile="mw/appsupport/appfw/viewserver/group" mrp="mw/appsupport/appfw/viewserver/group/app-framework_viewsrv.mrp"/>
+ </component>
+ <component name="uiftestfw" original-name="UIF Test Framework" long-name="UIF Test Framework" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Application Framework" comment="" class="test" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="28225">
+ <unit mrp="mw/appsupport/appfw/uiftestfw/group/app-framework_testframework.mrp"/>
+ </component>
+ </collection>
+ <collection name="applaunchservices" original-name="Application Launch Services" long-name="Application Launch Services" id="Application Launch Services" level="generic" contribution="contributed">
+ <component name="aftermarketappstarter" original-name="After Market Application Starter" long-name="After Market Application Starter" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Application Launch Services" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit bldFile="os/unref/orphan/comgen/app-framework/amastart/group" mrp="os/unref/orphan/comgen/app-framework/amastart/group/app-framework_amastart.mrp"/>
+ </component>
+ <component name="applaunchplugins" original-name="Application Launch Plugins" long-name="Application Launch Plugins" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Application Launch Services" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit bldFile="os/unref/orphan/comgen/app-framework/aplp/group" mrp="os/unref/orphan/comgen/app-framework/aplp/group/app-framework_aplp.mrp"/>
+ </component>
+ </collection>
+ <collection name="tzpcside" original-name="Time Zone PC Side" long-name="Time Zone PC Side" id="Time Zone PC Side" level="plugin" contribution="contributed">
+ <component name="worlddatabasekit" original-name="World Database Kit" long-name="World Database Kit" old_model="MCL" old_layer="MISC" old_package="PC Tools" old_collection="Time Zone PC Side" comment="" class="config PC" introduced="6.0" deprecated="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit bldFile="mw/appsupport/tzpcside/worlddatabasekit/group" mrp="mw/appsupport/tzpcside/worlddatabasekit/group/app-services_wlddatabasekit_cedar.mrp"/>
+ </component>
+ <component name="worldtools" original-name="World Tools" long-name="World Tools" old_model="MCL" old_layer="MISC" old_package="PC Tools" old_collection="Time Zone PC Side" comment="" class="config PC" introduced="ER5" deprecated="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="146457">
+ <unit bldFile="mw/appsupport/tzpcside/worldtools/group" mrp="mw/appsupport/tzpcside/worldtools/group/app-services_wldtools.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Security Services" tech_domain="se" level="1" name="securitysrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="boottimeintegritycheck" id="BootTimeIntegrityCheck" long-name="Boot Time Integrity Check" level="plugin" contribution="contributed">
+ <component name="TrkDummy" old_model="s60" old_layer="app" old_package="security" old_collection="BootTimeIntegrityCheck" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\app\security\BootTimeIntegrityCheck\TrkDummy" source_size="1896.6"/>
+ <component name="IntegrityCheckClient.dll=binary" old_model="s60" old_layer="app" old_package="security" old_collection="BootTimeIntegrityCheck" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\app\security\BootTimeIntegrityCheck\IntegrityCheckClient.dll=binary" source_size="0.0"/>
+ <component name="IntegrityCheckServer.exe=binary" old_model="s60" old_layer="app" old_package="security" old_collection="BootTimeIntegrityCheck" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\app\security\BootTimeIntegrityCheck\IntegrityCheckServer.exe=binary" source_size="0.0"/>
+ <component name="IntegrityCheck.exe=binary" old_model="s60" old_layer="app" old_package="security" old_collection="BootTimeIntegrityCheck" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\app\security\BootTimeIntegrityCheck\IntegrityCheck.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="securitydialogs" id="securityuis" long-name="Security Dialogs" level="specific" contribution="contributed">
+ <component name="Autolock" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="securityuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\securityuis\Autolock" source_size="167175.3"/>
+ <component name="keylockpolicyapi" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="securityuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\securityuis\keylockpolicyapi" source_size="251156.7"/>
+ <component name="SecUi" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="securityuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\securityuis\SecUi" source_size="1514267.4"/>
+ <component name="Securitynotifier" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="securityuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\securityuis\Securitynotifier" source_size="37151.1"/>
+ <component name="Securityobserver" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="securityuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\securityuis\Securityobserver" source_size="44886.3"/>
+ </collection>
+ <collection name="wim" id="WIM" long-name="WIM" level="framework" contribution="contributed">
+ <component name="Swimreader" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="WIM" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\WIM\Swimreader" source_size="379443.6"/>
+ <component name="Scard" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="WIM" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\WIM\Scard" source_size="854583.9"/>
+ <component name="WimUtil" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="WIM" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\WIM\WimUtil" source_size="11046.6"/>
+ <component name="WimServer" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="WIM" comment="" contribution="partial" source="no" partial_contribution="yes" partial_leftover="WIMI.LIB needs to be delivered as binary" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\WIM\WimServer" source_size="1936152.3"/>
+ <component name="WimClient" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="WIM" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\WIM\WimClient" source_size="1515036.0"/>
+ <component name="WimPlugin" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="WIM" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\WIM\WimPlugin" source_size="405965.7"/>
+ </collection>
+ <collection name="cms" id="CMS" long-name="Certificate Management Services" level="generic" contribution="contributed">
+ <component name="CMS.Dll=binary" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="CMS" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\CMS\CMS.Dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="pkiutilities" id="pkiutilities" long-name="PKI Utilities" level="plugin" contribution="contributed">
+ <component name="Certificates" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="Contains certificates from various 3rd parties." contribution="excluded" copyright_holder="BeTrusted, CyberTrust, Entrust, Equifax, GoDaddy, Startfield, Valicert, Verisign" license_type="commercial" license="Various" license_status="no" source="no" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\Certificates" source_size="141245.4"/>
+ <component name="CertmanUi" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\CertmanUi" source_size="610359.9"/>
+ <component name="CertSaver" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\CertSaver" source_size="311761.8"/>
+ <component name="CTSecurityDialogs" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\CTSecurityDialogs" source_size="503971.5"/>
+ <component name="DeviceToken" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\DeviceToken" source_size="301875.9"/>
+ <component name="PKCS12" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\PKCS12" source_size="110367.6"/>
+ <component name="SecModUI" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\SecModUI" source_size="268561.2"/>
+ <component name="x509certnameparser" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="pkiutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\pkiutilities\x509certnameparser" source_size="235969.8"/>
+ </collection>
+ <collection name="remotelock" id="remotelock" long-name="Remote Lock" level="server" contribution="contributed">
+ <component name="RemoteLockSettings" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="remotelock" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\remotelock\RemoteLockSettings" source_size="5025.0"/>
+ <component name="RemoteLockEngine" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="remotelock" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\remotelock\RemoteLockEngine" source_size="21385.5"/>
+ </collection>
+ </block>
+ <block long-name="DRM" tech_domain="se" level="1" name="drm" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="commondrm" id="commondrm" long-name="Common DRM" level="generic" contribution="contributed">
+ <component name="drmutility" old_model="s60" old_layer="mw" old_package="drm" old_collection="commondrm" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="drmencryptor" old_model="s60" old_layer="mw" old_package="drm" old_collection="commondrm" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\commondrm\drmencryptor" source_size="85452.3"/>
+ <component name="drmsettingsplugin" old_model="s60" old_layer="mw" old_package="drm" old_collection="commondrm" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\commondrm\drmsettingsplugin" source_size="184057.2"/>
+ <component name="drmrightsmanagerui" old_model="s60" old_layer="mw" old_package="drm" old_collection="commondrm" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\commondrm\drmrightsmanagerui" source_size="761430.3"/>
+ </collection>
+ <collection name="omadrm" id="omadrm" long-name="OMA DRM" level="server" contribution="excluded" copyright_holder="various IP holders" source="yes" ship_license_required="mandatory" license_type="commercial">
+ <component name="drmhelper" old_model="s60" old_layer="mw" old_package="drm" old_collection="omadrm" comment="" contribution="excluded" copyright_holder="various IP holders" source="yes" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\omadrm\drmhelper" source_size="3336148.8"/>
+ <component name="drmlicensemanager" old_model="s60" old_layer="mw" old_package="drm" old_collection="omadrm" comment="" contribution="excluded" copyright_holder="various IP holders" source="yes" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\omadrm\drmlicensemanager" source_size="199442.7"/>
+ <component name="drmplugins" old_model="s60" old_layer="mw" old_package="drm" old_collection="omadrm" comment="" contribution="excluded" copyright_holder="various IP holders" source="yes" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\omadrm\drmplugins" source_size="3175303.2"/>
+ <component name="drmroapwbxmlparser" old_model="s60" old_layer="mw" old_package="drm" old_collection="omadrm" comment="" contribution="excluded" copyright_holder="various IP holders" source="yes" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\omadrm\drmroapwbxmlparser" source_size="3928.8"/>
+ <component name="drmengine" old_model="s60" old_layer="mw" old_package="drm" old_collection="omadrm" comment="" contribution="excluded" copyright_holder="various IP holders" source="yes" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\omadrm\drmengine" source_size="9173157.0"/>
+ </collection>
+ <collection name="wmdrm" id="wmdrm" long-name="WM DRM" level="framework" contribution="excluded" copyright_holder="Microsoft" license_status="open" license_type="commercial" source="no" ship_license_required="mandatory">
+ <component name="camese" old_model="s60" old_layer="mw" old_package="drm" old_collection="wmdrm" comment="" contribution="excluded" copyright_holder="Microsoft" license_status="open" license_type="commercial" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\wmdrm\camese" source_size="606873.9"/>
+ <component name="wmdrmengine" old_model="s60" old_layer="mw" old_package="drm" old_collection="wmdrm" comment="" contribution="excluded" copyright_holder="Microsoft" license_status="open" license_type="commercial" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\wmdrm\wmdrmengine" source_size="237092.1"/>
+ <component name="wmdrmplugins" old_model="s60" old_layer="mw" old_package="drm" old_collection="wmdrm" comment="" contribution="excluded" copyright_holder="Real Networks" license_status="no" license_type="commercial" source="no" ship_license_required="mandatory" license="RPSL, RCSL, GPLv2" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\drm\wmdrm\wmdrmplugins" source_size="229673.1"/>
+ </collection>
+ </block>
+ <block long-name="Access Security" tech_domain="se" level="1" name="accesssec" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="wlaneapol" id="wlaneapol" long-name="WLAN EAPOL" level="generic" contribution="contributed">
+ <component name="wlan_symbian" old_model="s60" old_layer="mw" old_package="eapol" old_collection="wlaneapol" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="yes" path="\s60\mw\eapol\wlaneapol\wlan_symbian" source_size="4547787.9"/>
+ </collection>
+ <collection name="wlansecuritysettings" level="specific" contribution="contributed">
+ <component name="WEPSecuritySettingsUI" long-name="WEP Security Settings UI" id="WEPSecuritySettingsUI" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\WEPSecuritySettingsUI" source_size="559000.2"/>
+ <component name="wapisecuritysettingsui" long-name="WAPI Security Settings UI" id="wapisecuritysettingsui" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed"/>
+ <component name="wifiprotectedsetup" long-name="WiFi Protected Setup" id="wifiprotectedsetup" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\wifiprotectedsetup" source_size="1333672.2"/>
+ <component name="WlanEapSettingsUi" long-name="WLAN EAP Settings Ui" id="WlanEapSettingsUi" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\WlanEapSettingsUi" source_size="1751562.0"/>
+ <component name="WPASecuritySettingsUI" long-name="WPA Security Settings UI" id="WPASecuritySettingsUI" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\WPASecuritySettingsUI" source_size="542365.8"/>
+ </collection>
+ <collection name="eapol" level="framework" contribution="contributed">
+ <component name="eapfw" original-name="EAP Framework" long-name="EAP Framework" id="EAP Framework" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Link Layer Utilities" comment="" introduced="9.3" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1234880">
+ <unit bldFile="mw/accesssec/eapol/eapfw/group" mrp="mw/accesssec/eapol/eapfw/group/networking_eap.mrp"/>
+ </component>
+ <component name="eappluginsforwifi" original-name="EAP Plugins for WiFi" long-name="EAP Plugins for WiFi" id="EAP Plugins for WiFi" old_model="MCL" old_layer="OS Services" old_package="Networking Services" old_collection="Network Security" comment="" plugin="Y" introduced="9.3" contribution="contributed" not_used_by_s60="" in_production_device_rom="yes" platform_critical="no" source_size="92444">
+ <unit bldFile="os/wlan/wlan_bearer/wirelesslan/WiFiSecEapMods/group" mrp="os/wlan/wlan_bearer/wirelesslan/WiFiSecEapMods/group/networking_wifieap.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Location Services" tech_domain="lo" level="2" name="locationsrv" levels="plugins fw interface" contribution="contributed">
+ <collection name="landmarks" id="landmarks" long-name="Landmarks" level="fw" contribution="contributed">
+ <component name="LocationLandmarks" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="landmarks" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\landmarks\LocationLandmarks" source_size="17513976.6"/>
+ </collection>
+ <collection name="locationmapnavfw" id="locationmapnavfw" long-name="Location Map Nav Framework" level="fw" contribution="contributed">
+ <component name="aiwprovider" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationmapnavfw" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\locationmapnavfw\aiwprovider" source_size="41600.7"/>
+ <component name="library" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationmapnavfw" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\locationmapnavfw\library" source_size="63296.4"/>
+ </collection>
+ <collection name="locationsystemui" id="locationsystemui" long-name="Location System UI" level="interface" contribution="contributed">
+ <component name="LocationSysUi" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationsystemui" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\locationservices\locationsystemui\LocationSysUi" source_size="8339379.0"/>
+ </collection>
+ <collection name="locationtriggering" id="locationtriggering" long-name="Location Triggering" level="interface" contribution="contributed">
+ <component name="lbtmgmtui" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltcellidmovementdetector" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltclientlib" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltcontainer" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltlogger" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltmanagementlib" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltmovementdetectionpluginapi" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltserver" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltstrategyengine" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ <component name="ltstrategypluginapi" old_model="s60" old_layer="mw" old_package="locationservices" old_collection="locationtriggering" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="Telephony and SIM Services" tech_domain="vc" level="2" name="phonesrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="phonecmdhandler" level="generic" contribution="contributed">
+ <component name="phonecmdhandler" long-name="Phone Command Handler" id="phonecmdhandler" old_model="s60" old_layer="mw" old_package="systemswservices" old_collection="coreapplicationuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\systemswservices\coreapplicationuis\phonecmdhandler" source_size="597036.0"/>
+ </collection>
+ <collection name="cbs" id="cbs" long-name="Cellular Baseband Services" level="plugin" contribution="contributed">
+ <component name="CbsServer" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="cbs" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\cbs\CbsServer" source_size="4610876.1"/>
+ <component name="cbsui" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="cbs" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\cbs\cbsui" source_size="1070325.3"/>
+ </collection>
+ <collection name="convergedcallengine" id="convergedcallengine" long-name="Converged Call Engine" level="framework" contribution="contributed">
+ <component name="callprovider" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="convergedcallengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\convergedcallengine\callprovider" source_size="0.0"/>
+ <component name="cce" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="convergedcallengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\convergedcallengine\cce" source_size="4857817.2"/>
+ <component name="cenrepdatabase" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="convergedcallengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\convergedcallengine\cenrepdatabase" source_size="0.0"/>
+ <component name="csplugin" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="convergedcallengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\convergedcallengine\csplugin" source_size="687995.4"/>
+ <component name="serviceselector" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="convergedcallengine" comment="" contribution="contributed"/>
+ <component name="spsettings" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="convergedcallengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\convergedcallengine\spsettings" source_size="587955.6"/>
+ </collection>
+ <collection name="networkhandling" id="networkhandling" long-name="Network Handling" level="plugin" contribution="contributed">
+ <component name="networkhandlingengine" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="networkhandling" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\networkhandling\networkhandlingengine" source_size="1211613.9"/>
+ </collection>
+ <collection name="phoneclientserver" id="phoneclientserver" long-name="Phone Client/Server" level="server" contribution="contributed">
+ <component name="aiwdialdata" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="phoneclientserver" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata" source_size="193605.0"/>
+ <component name="CallUI" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="phoneclientserver" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\phoneclientserver\CallUI" source_size="904438.2"/>
+ <component name="dialutils" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="phoneclientserver" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\phoneclientserver\dialutils" source_size="5538.9"/>
+ <component name="EnPolicy" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="phoneclientserver" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\phoneclientserver\EnPolicy" source_size="911457.9"/>
+ <component name="phoneclient" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="phoneclientserver" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\phoneclientserver\phoneclient" source_size="1445320.5"/>
+ <component name="phoneserver" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="phoneclientserver" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\phoneclientserver\phoneserver" source_size="2385894.3"/>
+ </collection>
+ <collection name="satengine" id="satengine" long-name="Sat Engine" level="generic" contribution="contributed">
+ <component name="SatServer" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="satengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\satengine\SatServer" source_size="5050738.8"/>
+ </collection>
+ <collection name="satui" id="satui" long-name="Sat UI" level="specific" contribution="contributed">
+ <component name="satapp" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="satui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\satui\satapp" source_size="1310996.7"/>
+ <component name="satplugin" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="satui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\telephonyservices\satui\satplugin" source_size="208568.7"/>
+ </collection>
+ <collection name="telutils" id="utils" long-name="Utilities" contribution="contributed">
+ <component name="phoneparser" old_model="s60" old_layer="mw" old_package="telephonyservices" old_collection="utils" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneengine\phoneparser" source_size="347687.7"/>
+ </collection>
+ </block>
+ <block long-name="IP App Services" tech_domain="vc" level="1" name="ipappsrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="multimediacommscontroller" id="multimediacommscontroller" long-name="Multimedia Comms Controller" level="specific" contribution="contributed">
+ <component name="amrpayloadformatter" original-name="AMR Payload Formatter" long-name="AMR Payload Formatter" id="AMR Payload Formatter" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="IMS and streaming" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" in_production_device_rom="no" source_size="296163">
+ <unit bldFile="mw/ipappprotocols/realtimenetprots/rtpamr/group" mrp="mw/ipappprotocols/realtimenetprots/rtpamr/group/mm-protocols_rtpamr.mrp"/>
+ </component>
+ <component name="amrpayloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\amrpayloadformat" source_size="75862.8"/>
+ <component name="anypayloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\anypayloadformat" source_size="12803.1"/>
+ <component name="anysourcesink" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed"/>
+ <component name="avcpayloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\avcpayloadformat" source_size="41175.6"/>
+ <component name="controller" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="dtmfpayloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\dtmfpayloadformat" source_size="70897.8"/>
+ <component name="filesourcesink" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\filesourcesink" source_size="67976.1"/>
+ <component name="g711payloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed"/>
+ <component name="g729payloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed"/>
+ <component name="interface" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\interface" source_size="104226.0"/>
+ <component name="jitterbuffer" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\jitterbuffer" source_size="38560.5"/>
+ <component name="qoscontroller" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\qoscontroller" source_size="9587.1"/>
+ <component name="multiplexer" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\multiplexer" source_size="19076.1"/>
+ <component name="subcontroller" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\subcontroller" source_size="150336.0"/>
+ <component name="redpayloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\redpayloadformat" source_size="39478.5"/>
+ <component name="ilbcpayloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed"/>
+ <component name="rtpsourcesink" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\rtpsourcesink" source_size="51870.3"/>
+ <component name="videosourcesink" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\videosourcesink" source_size="82294.5"/>
+ <component name="h263payloadformat" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommscontroller\h263payloadformat" source_size="20229.6"/>
+ <component name="transcoder" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommscontroller" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="multimediacommsengine" id="multimediacommsengine" long-name="Multimedia Comms Engine" level="generic" contribution="contributed">
+ <component name="mceclient.dll=binary" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommsengine\mceclient.dll=binary" source_size="0.0"/>
+ <component name="fcpluginengine.dll=binary" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommsengine\fcpluginengine.dll=binary" source_size="0.0"/>
+ <component name="fctbcp.dll=binary" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommsengine\fctbcp.dll=binary" source_size="0.0"/>
+ <component name="mceserver.exe=binary" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="multimediacommsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\multimediacommsengine\mceserver.exe=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="IP Connectivity Management" tech_domain="dc" level="1" name="ipconnmgmt" levels="plugin framework server generic utils" contribution="contributed">
+ <collection name="alwayson_net_plugin" id="alwayson_net_plugin" long-name="Always On Net Plugin" level="server" contribution="contributed">
+ <component name="nsmldmalwaysonadapter" old_model="s60" old_layer="mw" old_package="networking" old_collection="alwayson_net_plugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\alwayson_net_plugin\nsmldmalwaysonadapter" source_size="257693.4"/>
+ <component name="pdpcontextmanager2" old_model="s60" old_layer="mw" old_package="networking" old_collection="alwayson_net_plugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\alwayson_net_plugin\pdpcontextmanager2" source_size="2974921.2"/>
+ </collection>
+ <collection name="bearermanagement" id="bearermanagement" long-name="Bearer Management" level="framework" contribution="contributed">
+ <component name="DataMobility" old_model="s60" old_layer="mw" old_package="networking" old_collection="bearermanagement" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\bearermanagement\DataMobility" source_size="3946513.8"/>
+ </collection>
+ <collection name="connectionmonitoring" id="connectionmonitoring" long-name="Connection Monitoring" level="server" contribution="contributed">
+ <component name="connectionmonitorplugin" long-name="Connection Monitor plugin" id="connectionmonitorplugin" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\connectionmonitorplugin" source_size="396399.0"/>
+ <component name="ConnectionMonitorUI" long-name="Connection Monitor UI" id="ConnectionMonitorUI" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\ConnectionMonitorUI" source_size="922682.4"/>
+ <component name="ConnMon" old_model="s60" old_layer="mw" old_package="networking" old_collection="connectionmonitoring" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\connectionmonitoring\ConnMon" source_size="3030346.2"/>
+ <component name="ConnMonExt" old_model="s60" old_layer="mw" old_package="networking" old_collection="connectionmonitoring" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\connectionmonitoring\ConnMonExt" source_size="329835.6"/>
+ </collection>
+ <collection name="accesspointcontrol" level="plugin" contribution="contributed">
+ <component name="apcontrollistplugin" long-name="Access Point Control List Plugin" id="apcontrollistplugin" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\apcontrollistplugin" source_size="935418.0"/>
+ </collection>
+ <collection name="apengine" level="framework" contribution="contributed">
+ <component name="ApEngine" long-name="Access Point Engine" id="ApEngine" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\ApEngine" source_size="1316608.5"/>
+ <component name="ApSettingsHandlerUi" long-name="Access Point Settings Handler UI" id="ApSettingsHandlerUi" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\ApSettingsHandlerUi" source_size="1148308.8"/>
+ <component name="ApSettingsPlugin" long-name="Access Point Settings Plugin" id="ApSettingsPlugin" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\ApSettingsPlugin" source_size="432831.3"/>
+ </collection>
+ <collection name="cmmanager" level="framework" contribution="contributed">
+ <component name="cmmanager" long-name="CM Manager" id="cmmanager" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\cmmanager" source_size="5969444.7"/>
+ </collection>
+ <collection name="dbcreator" level="utils" contribution="contributed">
+ <component name="dbcreator2" long-name="DB Creator2" id="dbcreator2" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\dbcreator2" source_size="2880558.6"/>
+ </collection>
+ <collection name="connectionutilities" level="utils" contribution="contributed">
+ <component name="ConnectionDialogs" long-name="ConnectionDialogs" id="ConnectionDialogs" old_model="s60" old_layer="mw" old_package="networking" old_collection="networkingutilities" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\networkingutilities\ConnectionDialogs" source_size="3022634.7"/>
+ </collection>
+ </block>
+ <block long-name="High-level Internet Protocols" tech_domain="dc" level="1" name="netprotocols" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="httpfilters" id="HttpFilters" long-name="HTTP Filters" level="plugin" contribution="contributed">
+ <component name="Cookie" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\Cookie" source_size="1034562.9"/>
+ <component name="DeflateFilter" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\DeflateFilter" source_size="516155.7"/>
+ <component name="HttpCacheManager" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpCacheManager" source_size="630183.9"/>
+ <component name="HttpFilterAcceptHeader" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterAcceptHeader" source_size="810218.7"/>
+ <component name="HttpFilterAuthentication" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterAuthentication" source_size="262727.7"/>
+ <component name="HttpFilterCache" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterCache" source_size="328368.9"/>
+ <component name="HttpFilterCommon" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterCommon" source_size="16130.4"/>
+ <component name="HttpFilterConnHandler" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterConnHandler" source_size="290984.4"/>
+ <component name="HttpFilterIop" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterIop" source_size="247878.9"/>
+ <component name="HttpFilterPipeliningConfig" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterPipeliningConfig" source_size="134188.8"/>
+ <component name="HttpFilterPreEmptProxyAuth" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterPreEmptProxyAuth" source_size="283868.7"/>
+ <component name="HttpFilterProxy" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterProxy" source_size="468270.0"/>
+ <component name="HttpFilterRedirectConfirmation" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\HttpFilterRedirectConfirmation" source_size="138150.9"/>
+ <component name="uaproffilter" old_model="s60" old_layer="mw" old_package="web" old_collection="HttpFilters" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\HttpFilters\uaproffilter" source_size="481239.6"/>
+ </collection>
+ <collection name="applayerprotocols" original-name="Application Layer Protocols" long-name="Application Layer Protocols" id="Application Layer Protocols" level="server" contribution="contributed">
+ <component name="httptransportfw" original-name="HTTP Transport Framework" long-name="HTTP Transport Framework" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Protocols" comment="" introduced="6.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="9009727">
+ <unit bldFile="mw/netprotocols/applayerprotocols/httptransportfw/group" mrp="mw/netprotocols/applayerprotocols/httptransportfw/group/http_transport-framework.mrp"/>
+ </component>
+ <component name="httpexamples" original-name="HTTP Examples" long-name="HTTP Examples" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Protocols" comment="" introduced="6.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="579260">
+ <unit bldFile="mw/netprotocols/applayerprotocols/httpexamples/group" mrp="mw/netprotocols/applayerprotocols/httpexamples/group/http_examples.mrp"/>
+ </component>
+ <component name="wappushsupport" original-name="WAP Push Support" long-name="WAP Push Support" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Protocols" comment="" introduced="6.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="94354">
+ <unit bldFile="mw/netprotocols/applayerprotocols/wappushsupport/Group" mrp="mw/netprotocols/applayerprotocols/wappushsupport/Group/wap-browser_wappushsupport.mrp"/>
+ </component>
+ <component name="wapbase" original-name="WAP Base" long-name="WAP Base" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Protocols" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="117611">
+ <unit bldFile="mw/netprotocols/applayerprotocols/wapbase/Group" mrp="mw/netprotocols/applayerprotocols/wapbase/Group/wap-browser_wapbase.mrp"/>
+ </component>
+ <component name="ftpengine" original-name="FTP Engine" long-name="FTP Engine" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Protocols" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="128331">
+ <unit bldFile="mw/netprotocols/applayerprotocols/ftpengine/group" mrp="mw/netprotocols/applayerprotocols/ftpengine/group/networking_ftp_e.mrp"/>
+ </component>
+ <component name="telnetengine" original-name="Telnet Engine" long-name="Telnet Engine" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Protocols" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="77742">
+ <unit bldFile="mw/netprotocols/applayerprotocols/telnetengine/group" mrp="mw/netprotocols/applayerprotocols/telnetengine/group/networking_telnet_e.mrp"/>
+ </component>
+ </collection>
+ <collection name="applayerpluginsandutils" original-name="Application Layer Plugins and Utils" long-name="Application Layer Plugins and Utils" id="Application Layer Plugins and Utils" level="framework" contribution="contributed">
+ <component name="uripermissionservices" original-name="URI Permission Services" long-name="URI Permission Services" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Plugins and Utils" comment="" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="322404">
+ <unit bldFile="mw/netprotocols/applayerpluginsandutils/uripermissionservices/group" mrp="mw/netprotocols/applayerpluginsandutils/uripermissionservices/group/application-protocols_ineturilist.mrp"/>
+ </component>
+ <component name="bookmarksupport" original-name="Bookmark Support" long-name="Bookmark Support" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Plugins and Utils" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="514484">
+ <unit bldFile="mw/netprotocols/applayerpluginsandutils/bookmarksupport/group" mrp="mw/netprotocols/applayerpluginsandutils/bookmarksupport/group/application-protocols_bookmarks.mrp"/>
+ </component>
+ <component name="httpprotocolplugins" original-name="HTTP Protocol Plugins" long-name="HTTP Protocol Plugins" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Plugins and Utils" comment="" plugin="Y" introduced="6.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="285396">
+ <unit bldFile="mw/netprotocols/applayerpluginsandutils/httpprotocolplugins/group" mrp="mw/netprotocols/applayerpluginsandutils/httpprotocolplugins/group/http_protocol-plugin.mrp"/>
+ </component>
+ <component name="httptransportplugins" original-name="HTTP Transport Plugins" long-name="HTTP Transport Plugins" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Application Layer Plugins and Utils" comment="" plugin="Y" introduced="6.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="71430">
+ <unit bldFile="mw/netprotocols/applayerpluginsandutils/httptransportplugins/group" mrp="mw/netprotocols/applayerpluginsandutils/httptransportplugins/group/http_transport-plugin.mrp"/>
+ </component>
+ </collection>
+ <collection name="wapstack" original-name="WAP Stack" long-name="WAP Stack" id="WAP Stack" level="plugin" contribution="contributed">
+ <component name="wapmessageapi" original-name="WAP Message API" long-name="WAP Message API" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="WAP Stack" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="507598">
+ <unit bldFile="mw/netprotocols/wapstack/wapmessageapi/group" mrp="mw/netprotocols/wapstack/wapmessageapi/group/wap-stack_wapmessage.mrp"/>
+ </component>
+ <component name="wapshortstack" original-name="WAP Short Stack" long-name="WAP Short Stack" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="WAP Stack" comment="" introduced="8.0" contribution="partial" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Various Commercial and OSS" license_status="No" ship_license="Mandatory" source="no" partial_contribution="yes" license="Telelogic; Sun (forensic); BSD Style" in_production_device_rom="yes" platform_critical="no">
+ <unit bldFile="mw/netprotocols/wapstack/wapshortstack/wapstack/group" mrp="mw/netprotocols/wapstack/wapshortstack/wapstack/group/wap-stack_wapstack.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="IP App Protocols" tech_domain="dc" level="1" name="ipappprotocols" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="rtp" id="rtp" long-name="RTP" level="server" contribution="contributed">
+ <component name="rtpstack" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="rtp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\rtp\rtpstack" source_size="1613084.4"/>
+ <component name="srtpstack" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="rtp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\rtp\srtpstack" source_size="244396.2"/>
+ </collection>
+ <collection name="sipplugins" id="sipplugins" long-name="SIP Plugins" level="framework" contribution="contributed">
+ <component name="DeviceManagementSIPAdapter" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="sipplugins" comment="" contribution="contributed"/>
+ <component name="SIPAdapter" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="sipplugins" comment="" contribution="contributed"/>
+ <component name="sipsettingsui" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="sipplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\sipplugins\sipsettingsui" source_size="181581.0"/>
+ <component name="sip_system_state_monitor" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="sipplugins" comment="" contribution="contributed"/>
+ <component name="sip_wlanplugin" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="sipplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ipappservices\sipplugins\sip_wlanplugin" source_size="64686.6"/>
+ </collection>
+ <collection name="sip_com" id="SIP_Com" long-name="SIP COM" level="framework" contribution="contributed">
+ <component name="SigComp" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ <component name="SDP" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ <component name="SIP" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ <component name="ClientResolver" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ <component name="ProfileAgent" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ <component name="SampleApp" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ <component name="SIPTestUI" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ <component name="TestDriver" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="SIP_Com" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="natfw" id="natfw" long-name="NAT Framework" level="framework" contribution="contributed">
+ <component name="connectionmultiplexer" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="natfwnatsettings" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="natfwclient" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="socketmediaconnwrapper" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="unsaf_protocols" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="stunturnclient" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="natfwstunserver" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="icecandidatehandler" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="stunplugin" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ <component name="turnplugin" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natfw" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="natplugins" id="natplugins" long-name="NAT Plugins" level="plugin" contribution="contributed">
+ <component name="ClientProvisioningNATFWTraversalAdapter" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natplugins" comment="" contribution="contributed"/>
+ <component name="DeviceManagementNATFWTraversalAdapter" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natplugins" comment="" contribution="contributed"/>
+ <component name="natfwsdpprovider" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natplugins" comment="" contribution="contributed"/>
+ <component name="nat_traversal_controller" old_model="s60" old_layer="mw" old_package="ipappservices" old_collection="natplugins" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="realtimenetprots" level="generic" contribution="contributed">
+ <component name="rtp" original-name="RTP" long-name="RTP" id="RTP" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="IMS and streaming" comment="" introduced="9.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1389595">
+ <unit bldFile="mw/ipappprotocols/realtimenetprots/rtp/group" mrp="mw/ipappprotocols/realtimenetprots/rtp/group/mm-protocols_rtp.mrp"/>
+ </component>
+ <component name="srtp" original-name="Secure RTP" long-name="Secure RTP" id="Secure RTP" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="IMS and streaming" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/mm-protocols/srtp/group" mrp="os/unref/orphan/comgen/mm-protocols/srtp/group/mm-protocols_srtp.mrp"/>
+ </component>
+ <component name="sipfw" original-name="SIP Framework" long-name="SIP Framework" id="SIP Framework" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="IMS and streaming" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="5771929">
+ <unit version="2" bldFile="mw/ipappprotocols/realtimenetprots/sipfw2/Group" mrp="mw/ipappprotocols/realtimenetprots/sipfw2/Group/mm-protocols_SIP2_Com.mrp"/>
+ <unit mrp="mw/ipappprotocols/realtimenetprots/sipfw/Group/mm-protocols_SIP_Com.mrp" removed="9.5" version="1" bldFile="mw/ipappprotocols/realtimenetprots/sipfw/Group"/>
+ <unit version="1" bldFile="mw/ipappprotocols/realtimenetprots/sipfw/Group" mrp="mw/ipappprotocols/realtimenetprots/sipfw/Group/mm-protocols_SIP_Com.mrp"/>
+ </component>
+ </collection>
+ <collection name="sipconnectionproviderplugins" original-name="SIP Connection Provider Plugins" long-name="SIP Connection Provider Plugins" id="SIP Connection Provider Plugins" level="plugin" contribution="contributed">
+ <component name="sipconnectionprovider" original-name="SIP Connection Provider" long-name="SIP Connection Provider" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="SIP Connection Provider Plugins" comment="" plugin="Y" introduced="9.2" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="mw/ipappprotocols/sipconnectionproviderplugins/sipconnectionprovider/group/mm-protocols_SIPCPR.mrp" bldFile="mw/ipappprotocols/sipconnectionproviderplugins/sipconnectionprovider/group"/>
+ </component>
+ <component name="sipdummyprt" original-name="SIP Dummy PRT" long-name="SIP Dummy PRT" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="SIP Connection Provider Plugins" comment="" plugin="Y" introduced="9.2" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="8380">
+ <unit bldFile="mw/ipappprotocols/sipconnectionproviderplugins/sipdummyprt/group" mrp="mw/ipappprotocols/sipconnectionproviderplugins/sipdummyprt/group/mm-protocols_SIPDummyPRT.mrp"/>
+ </component>
+ <component name="sipstatemachine" original-name="SIP State Machine" long-name="SIP State Machine" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="SIP Connection Provider Plugins" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="48376">
+ <unit bldFile="mw/ipappprotocols/sipconnectionproviderplugins/sipstatemachine/group" mrp="mw/ipappprotocols/sipconnectionproviderplugins/sipstatemachine/group/mm-protocols_SipStateMachine.mrp"/>
+ </component>
+ <component name="sipparams" original-name="SIP Params" long-name="SIP Params" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="SIP Connection Provider Plugins" comment="" plugin="Y" introduced="9.2" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="mw/ipappprotocols/sipconnectionproviderplugins/sipparams/group/mm-protocols_SIPParams.mrp" bldFile="mw/ipappprotocols/sipconnectionproviderplugins/sipparams/group"/>
+ </component>
+ <component name="sipsubconnectionprovider" original-name="SIP Subconnection Provider" long-name="SIP Subconnection Provider" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="SIP Connection Provider Plugins" comment="" plugin="Y" introduced="9.2" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="mw/ipappprotocols/sipconnectionproviderplugins/sipsubconnectionprovider/group/mm-protocols_SIPSCPR.mrp" bldFile="mw/ipappprotocols/sipconnectionproviderplugins/sipsubconnectionprovider/group"/>
+ </component>
+ <component name="sipconnectionplugins" original-name="SIP Connection Plugins" long-name="SIP Connection Plugins" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="SIP Connection Provider Plugins" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="377984">
+ <unit bldFile="mw/ipappprotocols/realtimenetprots/sipfwProviders/group" mrp="mw/ipappprotocols/realtimenetprots/sipfwProviders/group/mm-protocols_sipproviders.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Wireless Access" tech_domain="de" level="2" name="wirelessacc" levels="empty framework generic" contribution="contributed">
+ <collection name="hotspotfw" id="hotspotfw" long-name="Hotspot Framework" level="framework" contribution="contributed">
+ <component name="Hotspot_FW" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="hotspotfw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\hotspotfw\Hotspot_FW" source_size="1078161.6"/>
+ </collection>
+ <collection name="wlanutilities" id="wlanutilities" long-name="WLAN Utilities" level="generic" contribution="contributed">
+ <component name="wlanindicatorplugin" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="wlanutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\wlanutilities\wlanindicatorplugin" source_size="36873.0"/>
+ <component name="wlanplugin" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="wlanutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\wlanutilities\wlanplugin" source_size="497918.7"/>
+ <component name="wlansettingsui" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="wlanutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\wlanutilities\wlansettingsui" source_size="643678.5"/>
+ <component name="wlansniffer" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="wlanutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\wlanutilities\wlansniffer" source_size="4079437.2"/>
+ </collection>
+ </block>
+ <block long-name="Remote Storage" tech_domain="de" level="1" name="remotestorage" levels="unused framework" contribution="contributed">
+ <collection name="remotestoragefw" id="remotestoragefw" long-name="Remote Storage Framework" level="framework" contribution="contributed">
+ <component name="gsplugin" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="mountmanager" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\remotestorage\remotestoragefw\mountmanager" source_size="280460.1"/>
+ <component name="mountstore" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\remotestorage\remotestoragefw\mountstore" source_size="217391.7"/>
+ <component name="remotedriveconfigurationbiocontrol" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\remotestorage\remotestoragefw\remotedriveconfigurationbiocontrol" source_size="227487.9"/>
+ <component name="remotefileengine" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\remotestorage\remotestoragefw\remotefileengine" source_size="1274517.0"/>
+ <component name="remotefilesystemplugin" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\remotestorage\remotestoragefw\remotefilesystemplugin" source_size="302347.5"/>
+ <component name="rsfwnotifierplugins" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\remotestorage\remotestoragefw\rsfwnotifierplugins" source_size="386957.1"/>
+ <component name="webdavaccessplugin" old_model="s60" old_layer="mw" old_package="remotestorage" old_collection="remotestoragefw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\remotestorage\remotestoragefw\webdavaccessplugin" source_size="515408.7"/>
+ </collection>
+ </block>
+ <block long-name="Remote Connectivity" tech_domain="de" level="2" name="remoteconn" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="connectivitymodules" id="connectivitymodules" long-name="Connectivity Modules" level="framework" contribution="contributed">
+ <component name="SeCon" old_model="s60" old_layer="mw" old_package="contentmanagement" old_collection="connectivitymodules" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\contentmanagement\connectivitymodules\SeCon" source_size="4191916.8"/>
+ </collection>
+ <collection name="backup" long-name="Backup and Restore" id="Backup and Restore" level="specific" contribution="contributed">
+ <component name="backupengine" original-name="Backup Engine" long-name="Backup Engine" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Backup and Restore" comment="" introduced="9.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="238697">
+ <unit bldFile="mw/remoteconn/backup/backupengine/group" mrp="mw/remoteconn/backup/backupengine/group/connectivity_backupengine.mrp"/>
+ </component>
+ </collection>
+ <collection name="connectivitytransports" original-name="Connectivity Transports" long-name="Connectivity Transports" id="Connectivity Transports" level="plugin" contribution="contributed">
+ <component name="mrouter" original-name="m-Router" long-name="m-Router" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Connectivity Transports" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="191768">
+ <unit bldFile="mw/remoteconn/connectivitytransports/mrouter/group" mrp="mw/remoteconn/connectivitytransports/mrouter/group/connectivity_mRouterSecure.mrp"/>
+ </component>
+ <component name="plpremotelink" original-name="PLP Remote Link" long-name="PLP Remote Link" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Connectivity Transports" comment="" deprecated="9.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="114230">
+ <unit bldFile="mw/remoteconn/connectivitytransports/plpremotelink/plpgrp" mrp="mw/remoteconn/connectivitytransports/plpremotelink/plpgrp/connectivity_legacy_plp_plpgrp.mrp"/>
+ </component>
+ <component name="plpvariant" original-name="PLP Variant" long-name="PLP Variant" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Connectivity Transports" comment="" deprecated="9.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="4638">
+ <unit bldFile="mw/remoteconn/connectivitytransports/plpremotelink/plpvariant" mrp="mw/remoteconn/connectivitytransports/plpremotelink/plpvariant/connectivity_legacy_plp_plpvariant.mrp"/>
+ </component>
+ <component name="eventbroadcast" original-name="Event Broadcast" long-name="Event Broadcast" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Connectivity Transports" comment="" deprecated="9.0" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="mw/remoteconn/connectivitytransports/eventbroadcast/group/connectivity_legacy_brdcst.mrp" bldFile="mw/remoteconn/connectivitytransports/eventbroadcast/group"/>
+ </component>
+ </collection>
+ <collection name="mtpfw" long-name="MTP Transports and Framework" id="MTP Transports and Framework" level="framework" contribution="contributed">
+ <component name="mtpintegrationtest" original-name="MTP Integration Test" long-name="MTP Integration Test" id="MTP Integration Test" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Remote Management Test" comment="" class="test" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="11652981">
+ <unit bldFile="mw/remoteconn/mtpfw/mtpintegrationtest/group" mrp="mw/remoteconn/mtpfw/mtpintegrationtest/group/mtp_test.mrp"/>
+ </component>
+ <component name="mtpfw" original-name="MTP Framework" long-name="MTP Framework" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="MTP Transports and Framework" comment="" introduced="9.4" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Microsoft" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Microsoft" in_production_device_rom="yes" platform_critical="no" source_size="5036473">
+ <unit bldFile="mw/remoteconn/mtpfw/mtpfw/group" mrp="mw/remoteconn/mtpfw/mtpfw/group/mtp_framework.mrp"/>
+ </component>
+ <component name="mtpusbtransport" original-name="MTP USB Transport" long-name="MTP USB Transport" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="MTP Transports and Framework" comment="" plugin="Y" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="69901">
+ <unit bldFile="mw/remoteconn/mtpfw/mtpusbtransport/group" mrp="mw/remoteconn/mtpfw/mtpusbtransport/group/mtp_usbsic.mrp"/>
+ </component>
+ <component name="mtpptpiptransport" original-name="MTP PTP-IP Transport" long-name="MTP PTP-IP Transport" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="MTP Transports and Framework" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="89859">
+ <unit bldFile="os/unref/orphan/comgen/mtp/transports/ptpip/group" mrp="os/unref/orphan/comgen/mtp/transports/ptpip/group/mtp_ptpip.mrp"/>
+ </component>
+ </collection>
+ <collection name="mtpdataproviders" original-name="MTP Data Providers" long-name="MTP Data Providers" id="MTP Data Providers" level="generic" contribution="contributed">
+ <component name="mtpfileandfolderprovider" original-name="MTP File and Folder Provider" long-name="MTP File and Folder Provider" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="MTP Data Providers" comment="" plugin="Y" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="19830">
+ <unit bldFile="mw/remoteconn/mtpdataproviders/mtpfileandfolderprovider/group" mrp="mw/remoteconn/mtpdataproviders/mtpfileandfolderprovider/group/mtp_filedp.mrp"/>
+ </component>
+ <component name="backupandrestoreprovider" original-name="Backup and Restore Provider" long-name="Backup and Restore Provider" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="MTP Data Providers" comment="" plugin="Y" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/mtp/dataproviders/backupnrestoredp/group" mrp="os/unref/orphan/comgen/mtp/dataproviders/backupnrestoredp/group/mtp_backupnrestoredp.mrp"/>
+ </component>
+ <component name="syncmldataprovider" original-name="SyncML Data Provider" long-name="SyncML Data Provider" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="MTP Data Providers" comment="" plugin="Y" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/mtp/dataproviders/syncdp/group" mrp="os/unref/orphan/comgen/mtp/dataproviders/syncdp/group/mtp_syncdp.mrp"/>
+ </component>
+ </collection>
+ <collection name="connectivitypcside" original-name="Connectivity PC Side" long-name="Connectivity PC Side" id="Connectivity PC Side" level="generic" contribution="contributed">
+ <component name="chatscripts" original-name="CHATSCRIPTS" long-name="Chat Scripts" old_model="MCL" old_layer="MISC" old_package="PC Tools" old_collection="Connectivity PC Side" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit bldFile="mw/remoteconn/connectivitypcside/chatscripts/group" mrp="mw/remoteconn/connectivitypcside/chatscripts/group/testtools_chatscripts.mrp"/>
+ </component>
+ <component name="connectqi" original-name="ConnectQI" long-name="ConnectQI" old_model="MCL" old_layer="MISC" old_package="PC Tools" old_collection="Connectivity PC Side" comment="" class="PC" introduced="9.1" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Various Commercial and OSS" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="GPL 2.0; Nullsoft Inc; Various OSS (Unknown - possibly GPL variants)" in_production_device_rom="yes" platform_critical="no" source_size="2781380">
+ <unit mrp="mw/remoteconn/connectivitypcside/connectqi/connectqisdk_mr3.mrp"/>
+ </component>
+ <component name="connectqisdk" original-name="ConnectQI SDK" long-name="ConnectQI SDK" old_model="MCL" old_layer="MISC" old_package="PC Tools" old_collection="Connectivity PC Side" comment="" class="PC" introduced="9.1" removed="9.5" contribution="contributed" source="no" partial_contribution="" in_production_device_rom="yes">
+ <unit mrp="mw/remoteconn/connectivitypcside/connectqisdk/connectqisdk_public.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Service Discovery and Usage" tech_domain="de" level="2" name="srvdiscovery" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="upnpstack" id="upnpstack" long-name="UPnP Stack" level="framework" contribution="contributed">
+ <component name="controlpointbase" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpstack\controlpointbase" source_size="437457.6"/>
+ <component name="dlnawebserver" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpstack\dlnawebserver" source_size="3941690.7"/>
+ <component name="messagehandler" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpstack\messagehandler" source_size="460470.0"/>
+ <component name="serviceframework" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpstack\serviceframework" source_size="1367731.5"/>
+ <component name="ssdpserver" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpstack\ssdpserver" source_size="541988.4"/>
+ <component name="upnpconnectionmanagersession" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed"/>
+ <component name="upnpconnmanager" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed"/>
+ <component name="upnphttptransfer" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed"/>
+ <component name="upnputils" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpstack" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpstack\upnputils" source_size="501281.7"/>
+ </collection>
+ <collection name="servicediscoveryandcontrol" original-name="Service Discovery and Control" long-name="Service Discovery and Control" id="Service Discovery and Control" level="framework" contribution="contributed">
+ <component name="upnp" original-name="UPnP" long-name="UPnP" old_model="MCL" old_layer="Generic Middleware" old_package="High-level Internet Protocols" old_collection="Service Discovery and Control" comment="" introduced="9.6" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/application-protocols/upnp/group" mrp="os/unref/orphan/comgen/application-protocols/upnp/group/application-protocols_upnp.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Remote Management" tech_domain="dm" level="2" name="remotemgmt" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="ahleclient" id="ahleclient" long-name="AHLE Client" level="generic" contribution="contributed">
+ <component name="ahle2client.dll=binary" long-name="AHLE Client" id="ahle2client.dll=binary" old_model="s60" old_layer="mw" old_package="ahle" old_collection="ahleclient" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\ahle\ahleclient\ahle2client.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="ahleserver" id="ahleserver" long-name="AHLE Server" level="server" contribution="contributed">
+ <component name="ahle2server.exe=binary" long-name="AHLE Server" id="ahle2server.exe=binary" old_model="s60" old_layer="mw" old_package="ahle" old_collection="ahleserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\ahle\ahleserver\ahle2server.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="omaprovisioning" id="omaprovisioning" long-name="OMA Provisioning" level="specific" contribution="contributed">
+ <component name="PnpUtil" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="omaprovisioning" comment="" contribution="contributed"/>
+ <component name="Provisioning" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="omaprovisioning" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\devicecontentservices\omaprovisioning\Provisioning" source_size="4534639.5"/>
+ </collection>
+ <collection name="policymanagement" id="policymanagement" long-name="Policy Management" level="generic" contribution="contributed">
+ <component name="tarmpolicymng" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="policymanagement" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\devicecontentservices\policymanagement\tarmpolicymng" source_size="675802.2"/>
+ </collection>
+ <collection name="syncmlfw" id="syncmlfw" long-name="SyncML Framework" level="server" contribution="contributed">
+ <component name="common" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="syncmlfw" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60=""/>
+ <component name="dm" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="syncmlfw" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\devicecontentservices\syncmlfw\dm" source_size="294622.2"/>
+ <component name="ds" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="syncmlfw" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\devicecontentservices\syncmlfw\ds" source_size="524643.3"/>
+ </collection>
+ <collection name="terminalsecurity" id="terminalsecurity" long-name="Terminal Security" level="specific" contribution="contributed">
+ <component name="tarmterminalcontrol" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="terminalsecurity" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\devicecontentservices\terminalsecurity\tarmterminalcontrol" source_size="1255180.5"/>
+ </collection>
+ <collection name="devicediagnosticsfw" id="devicediagnosticsfw" long-name="Device Diagnostics Framework" level="framework" contribution="contributed">
+ <component name="diagframework" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="devicediagnosticsfw" comment="" contribution="contributed"/>
+ <component name="diagpluginbase" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="devicediagnosticsfw" comment="" contribution="contributed"/>
+ <component name="diagresultsdb" old_model="s60" old_layer="mw" old_package="devicecontentservices" old_collection="devicediagnosticsfw" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="remotemgmttest" original-name="Remote Management Test" long-name="Remote Management Test" id="Remote Management Test" level="specific" contribution="contributed">
+ <component name="omasyncmlintegrationtest" original-name="OMA SyncML Integration Test" long-name="OMA SyncML Integration Test" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Remote Management Test" comment="" class="test" introduced="7.0s" deprecated="9.5" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Ericsson IBM" license_status="No" ship_license="Mandatory" source="no" partial_contribution="" license="Ericsson IBM" in_production_device_rom="no" platform_critical="no" source_size="9236803">
+ <unit bldFile="mw/remotemgmt/remotemgmttest/omasyncmlintegrationtest/group" mrp="mw/remotemgmt/remotemgmttest/omasyncmlintegrationtest/group/oma_syncml_integtest.mrp"/>
+ </component>
+ <component name="omadevicemgmtintegrationtest" original-name="OMA Device Management Integration Test" long-name="OMA Device Management Integration Test" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Remote Management Test" comment="" class="test" introduced="9.1" deprecated="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="7731606">
+ <unit bldFile="mw/remotemgmt/remotemgmttest/omadevicemgmtintegrationtest/group" mrp="mw/remotemgmt/remotemgmttest/omadevicemgmtintegrationtest/group/devprov_integtest.mrp"/>
+ </component>
+ </collection>
+ <collection name="syncandremotemgmtfw" original-name="Sync and Remote Management Framework" long-name="Sync and Remote Management Framework" id="Sync and Remote Management Framework" level="framework" contribution="contributed">
+ <component name="omasyncmldatasync" original-name="OMA SyncML Data Sync" long-name="OMA SyncML Data Sync" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" introduced="7.0s" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1071613">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtfw/omasyncmldatasync/Group" mrp="mw/remotemgmt/syncandremotemgmtfw/omasyncmldatasync/Group/oma_syncml_datasync.mrp"/>
+ </component>
+ <component name="omasyncmlcommonfw" original-name="OMA SyncML Common Framework" long-name="OMA SyncML Common Framework" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" introduced="7.0s" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="6491797">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtfw/omasyncmlcommonfw/Group" mrp="mw/remotemgmt/syncandremotemgmtfw/omasyncmlcommonfw/Group/oma_syncml_common_framework.mrp"/>
+ </component>
+ <component name="omasyncmldminterface" original-name="OMA SyncML DM Interface" long-name="OMA SyncML DM Interface" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" introduced="7.0s" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="671270">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtfw/omasyncmldminterface/group" mrp="mw/remotemgmt/syncandremotemgmtfw/omasyncmldminterface/group/oma_syncml_dm_interface.mrp"/>
+ </component>
+ <component name="omasyncmlconfig" original-name="OMA SyncML Config" long-name="OMA SyncML Config" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" class="config" introduced="9.4" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="4369">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtfw/omasyncmlconfig/group" mrp="mw/remotemgmt/syncandremotemgmtfw/omasyncmlconfig/group/oma_syncml_config.mrp"/>
+ </component>
+ <component name="devicemgmtfw" original-name="Device Management Framework" long-name="Device Management Framework" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" introduced="8.0" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="6589998">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtfw/devicemgmtfw/group" mrp="mw/remotemgmt/syncandremotemgmtfw/devicemgmtfw/group/devprov_devman_framework.mrp"/>
+ </component>
+ <component name="devicemgmtfwconfig" original-name="Device Management Framework Config" long-name="Device Management Framework Config" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" class="config" introduced="9.5" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="9878">
+ <unit bldFile="os/unref/orphan/comgen/devprov/config/devman/group" mrp="os/unref/orphan/comgen/devprov/config/devman/group/dmframeworkconfig.mrp" priority="10"/>
+ </component>
+ <component name="clientprovisioningfw" original-name="Client Provisioning Framework" long-name="Client Provisioning Framework" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" introduced="9.1" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1542012">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtfw/clientprovisioningfw/Group" mrp="mw/remotemgmt/syncandremotemgmtfw/clientprovisioningfw/Group/devprov_clientprov_framework.mrp"/>
+ </component>
+ <component name="clientprovisioningfwconfig" original-name="Client Provisioning Framework Config" long-name="Client Provisioning Framework Config" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Framework" comment="" class="config" introduced="9.5" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="9714">
+ <unit bldFile="os/unref/orphan/comgen/devprov/config/clientprov/group" mrp="os/unref/orphan/comgen/devprov/config/clientprov/group/cpframeworkconfig.mrp" priority="10"/>
+ </component>
+ </collection>
+ <collection name="syncandremotemgmtservices" original-name="Sync and Remote Management Services" long-name="Sync and Remote Management Services" id="Sync and Remote Management Services" level="plugin" contribution="contributed">
+ <component name="datasyncadaptors" original-name="Data Sync Adaptors" long-name="Data Sync Adaptors" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Services" comment="" plugin="Y" introduced="7.0s" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="99157">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtservices/datasyncadaptors/group" mrp="mw/remotemgmt/syncandremotemgmtservices/datasyncadaptors/group/data_sync_adaptors.mrp"/>
+ </component>
+ <component name="devicemgmtadaptors" original-name="Device Management Adaptors" long-name="Device Management Adaptors" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Services" comment="" plugin="Y" introduced="9.1" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="12983701">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtservices/devicemgmtadaptors/devman/Group" mrp="mw/remotemgmt/syncandremotemgmtservices/devicemgmtadaptors/devman/Group/devprov_devman_adapters.mrp"/>
+ </component>
+ <component name="devicemgmtadaptorsconfig" original-name="Device Management Adaptors Config" long-name="Device Management Adaptors Config" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Services" comment="" class="config" introduced="9.5" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="24492">
+ <unit bldFile="os/unref/orphan/comgen/devprov/config/adapters/devman/group" mrp="os/unref/orphan/comgen/devprov/config/adapters/devman/group/dmadaptersconfig.mrp" priority="10"/>
+ </component>
+ <component name="clientprovisioningadaptors" original-name="Client Provisioning Adaptors" long-name="Client Provisioning Adaptors" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Services" comment="" plugin="Y" introduced="9.1" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="707207">
+ <unit bldFile="mw/remotemgmt/syncandremotemgmtservices/clientprovisioningadaptors/group" mrp="mw/remotemgmt/syncandremotemgmtservices/clientprovisioningadaptors/group/devprov_clientprov_adapters.mrp"/>
+ </component>
+ <component name="clientprovisioningadaptorsconfig" original-name="Client Provisioning Adaptors Config" long-name="Client Provisioning Adaptors Config" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Sync and Remote Management Services" comment="" class="config" introduced="9.5" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="12120">
+ <unit bldFile="os/unref/orphan/comgen/devprov/config/adapters/clientprov/group" mrp="os/unref/orphan/comgen/devprov/config/adapters/clientprov/group/cpadaptersconfig.mrp" priority="10"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Shortlink Connectivity" tech_domain="de" level="1" name="shortlinkconn" levels="framework server generic specific plugin" contribution="contributed">
+ <collection name="bluetoothengine" id="bluetoothengine" long-name="Bluetooth Engine" level="framework" contribution="contributed">
+ <component name="btaudioman" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btaudioman" source_size="1969260.6"/>
+ <component name="btaudiostreamer" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btaudiostreamer" source_size="17812277.7"/>
+ <component name="bteng" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\bteng" source_size="1060143.9"/>
+ <component name="bthid" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed"/>
+ <component name="btmac" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btmac" source_size="2835908.7"/>
+ <component name="btnotif" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btnotif" source_size="2105615.1"/>
+ <component name="btpbap" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btpbap" source_size="186815.7"/>
+ <component name="btsac" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btsac" source_size="1617696.9"/>
+ <component name="btsap" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btsap" source_size="1067345.1"/>
+ <component name="btui" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="bluetoothengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\bluetoothengine\btui" source_size="3061900.5"/>
+ </collection>
+ <collection name="localconnectivityservice" id="localconnectivityservice" long-name="Local Connectivity Service" level="server" contribution="contributed">
+ <component name="atext" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\atext" source_size="33040.2"/>
+ <component name="dun" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\dun" source_size="2402987.4"/>
+ <component name="generichid" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed"/>
+ <component name="irapp" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\irapp" source_size="947046.3"/>
+ <component name="lcstylustap" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\lcstylustap" source_size="232775.4"/>
+ <component name="locod" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\locod" source_size="359065.8"/>
+ <component name="obexreceiveservices" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\obexreceiveservices" source_size="2828774.7"/>
+ <component name="obexsendservices" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\obexsendservices" source_size="2297315.1"/>
+ <component name="obexserviceman" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="localconnectivityservice" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\localconnectivityservice\obexserviceman" source_size="1044772.8"/>
+ </collection>
+ <collection name="usbclasses" id="usbclasses" long-name="USB classes" level="framework" contribution="contributed">
+ <component name="pictbridgeengine" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbclasses\pictbridgeengine" source_size="705020.4"/>
+ <component name="ptpserver" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbclasses\ptpserver" source_size="709072.8"/>
+ <component name="ptpstack" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbclasses\ptpstack" source_size="610534.5"/>
+ <component name="sicdusbplugin" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbclasses\sicdusbplugin" source_size="914218.2"/>
+ <component name="usbbasicpersonality" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbclasses\usbbasicpersonality" source_size="270053.4"/>
+ <component name="usbmscpersonality" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbclasses\usbmscpersonality" source_size="582539.7"/>
+ <component name="usbobexclasscontroller" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="yes" path="\s60\mw\localconnectivity\usbclasses\usbobexclasscontroller" source_size="312086.1"/>
+ <component name="usbosdescriptorhandler" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbclasses" comment="" contribution="excluded" copyright_holder="Microsoft" license_type="commercial" ship_license_required="mandatory" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbclasses\usbosdescriptorhandler" source_size="397674.3"/>
+ </collection>
+ <collection name="usbengines" id="usbengines" long-name="USB Engines" level="generic" contribution="contributed">
+ <component name="usbdevcon" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbengines" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbengines\usbdevcon" source_size="1158794.1"/>
+ <component name="usblocodplugin" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbengines" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbengines\usblocodplugin" source_size="232332.6"/>
+ <component name="usbremotepersonality" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbengines" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbengines\usbremotepersonality" source_size="650417.1"/>
+ <component name="usbwatcher" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbengines" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbengines\usbwatcher" source_size="1167829.8"/>
+ </collection>
+ <collection name="usbuis" id="usbuis" long-name="USB UIs" level="specific" contribution="contributed">
+ <component name="imageprintui" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\localconnectivity\usbuis\imageprintui" source_size="1013044.5"/>
+ <component name="imageprintuiprovider" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\localconnectivity\usbuis\imageprintuiprovider" source_size="281662.8"/>
+ <component name="usbui" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbuis\usbui" source_size="775242.6"/>
+ <component name="usbuinotif" old_model="s60" old_layer="mw" old_package="localconnectivity" old_collection="usbuis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\localconnectivity\usbuis\usbuinotif" source_size="698934.0"/>
+ </collection>
+ <collection name="obex" original-name="OBEX" long-name="OBEX" id="OBEX" level="generic" contribution="contributed">
+ <component name="obexprotocol" original-name="OBEX Protocol" long-name="OBEX Protocol" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="OBEX" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1493188">
+ <unit bldFile="mw/shortlinkconn/obex/obexprotocol/group" mrp="mw/shortlinkconn/obex/obexprotocol/group/obex.mrp"/>
+ </component>
+ <component name="obexextensionapi" original-name="OBEX Extension API" long-name="OBEX Extension API" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="OBEX" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="15241">
+ <unit bldFile="mw/shortlinkconn/obex/obexextensionapi/group" mrp="mw/shortlinkconn/obex/obexextensionapi/group/obex_extensionapis.mrp"/>
+ </component>
+ </collection>
+ <collection name="bluetoothappprofiles" original-name="Bluetooth Application Profiles" long-name="Bluetooth Application Profiles" id="Bluetooth Application Profiles" level="plugin" contribution="contributed">
+ <component name="avrcp" original-name="Bluetooth AVRCP" long-name="Bluetooth AVRCP" old_model="MCL" old_layer="Application Services" old_package="Remote Management and Connectivity" old_collection="Bluetooth Application Profiles" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="158260">
+ <unit bldFile="mw/shortlinkconn/bluetoothappprofiles/avrcp" mrp="mw/shortlinkconn/bluetoothappprofiles/avrcp/bluetooth_avrcp.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Networking Device Management" tech_domain="dm" level="1" name="networkingdm" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="clientprovisioning" level="specific" contribution="contributed">
+ <component name="omacp" long-name="OMA Client Provisioning" id="omacp" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="compaccdm" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\compaccdm\omacp" source_size="691584.0"/>
+ </collection>
+ <collection name="devicemanagement" level="specific" contribution="contributed">
+ <component name="omadm" long-name="OMA Device Management" id="omadm" old_model="s60" old_layer="mw" old_package="compaccutils" old_collection="compaccdm" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\compaccutils\compaccdm\omadm" source_size="1480879.8"/>
+ </collection>
+ </block>
+ <block long-name="VPN Client" tech_domain="pr" level="2" name="vpnclient" levels="engine ui api" contribution="contributed">
+ <collection name="vpnclient_sis" id="vpnclient_sis" long-name="VPN Client Sis" level="api" contribution="contributed">
+ <component name="vpnclient_sis compo" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnclient_sis" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnclient_sis\vpnclient_sis compo" source_size="0.0"/>
+ </collection>
+ <collection name="vpnengine" id="vpnengine" long-name="VPN Engine" level="engine" contribution="contributed">
+ <component name="acuagent" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\acuagent" source_size="0.0"/>
+ <component name="acuagentcrypto" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\acuagentcrypto" source_size="0.0"/>
+ <component name="acuagentmessage" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\acuagentmessage" source_size="0.0"/>
+ <component name="acuagenttransport" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\acuagenttransport" source_size="0.0"/>
+ <component name="acuins" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\acuins" source_size="246.9"/>
+ <component name="acupluginlib" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\acupluginlib" source_size="0.0"/>
+ <component name="dmadengine" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\dmadengine" source_size="0.0"/>
+ <component name="dmadipsecvpn" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\dmadipsecvpn" source_size="0.0"/>
+ <component name="dmadpki" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\dmadpki" source_size="0.0"/>
+ <component name="eventmediator" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\eventmediator" source_size="352494.6"/>
+ <component name="eventmediatorapi" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\eventmediatorapi" source_size="0.0"/>
+ <component name="eventviewer" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\eventviewer" source_size="0.0"/>
+ <component name="ikecert" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\ikecert" source_size="0.0"/>
+ <component name="ikepolparser" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\ikepolparser" source_size="65433.9"/>
+ <component name="ikesocketplugin" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\ikesocketplugin" source_size="0.0"/>
+ <component name="ikev1lib" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed"/>
+ <component name="ikev2lib" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed"/>
+ <component name="ipsecacuplugin" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\ipsecacuplugin" source_size="0.0"/>
+ <component name="kmdapi" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed"/>
+ <component name="kmdserver" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\kmdserver" source_size="1465293.3"/>
+ <component name="pkiservice" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\pkiservice" source_size="201837.3"/>
+ <component name="pkiserviceapi" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\pkiserviceapi" source_size="0.0"/>
+ <component name="sit" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\sit" source_size="565994.4"/>
+ <component name="utlbase64" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\utlbase64" source_size="0.0"/>
+ <component name="utlcrypto" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\utlcrypto" source_size="0.0"/>
+ <component name="utlpkcs10" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\utlpkcs10" source_size="0.0"/>
+ <component name="utlpkcs12" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\utlpkcs12" source_size="218802.0"/>
+ <component name="utlxml" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\utlxml" source_size="0.0"/>
+ <component name="vpnapi" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnapi" source_size="0.0"/>
+ <component name="vpnawapi" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnawapi" source_size="0.0"/>
+ <component name="vpncleaner" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpncleaner" source_size="0.0"/>
+ <component name="vpnconnagt" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnconnagt" source_size="317862.0"/>
+ <component name="vpnextapi" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnextapi" source_size="0.0"/>
+ <component name="vpnins" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnins" source_size="0.0"/>
+ <component name="vpnipsecpolparser" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnipsecpolparser" source_size="0.0"/>
+ <component name="vpnmanager" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnmanager" source_size="0.0"/>
+ <component name="vpnnif" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpnnif" source_size="0.0"/>
+ <component name="vpnpfkey" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed"/>
+ <component name="vpntcwrapper" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnengine" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnengine\vpntcwrapper" source_size="0.0"/>
+ </collection>
+ <collection name="vpnui" id="vpnui" long-name="VPN UI" level="ui" contribution="contributed">
+ <component name="vpndialogmanager" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnui" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnui\vpndialogmanager" source_size="81864.6"/>
+ <component name="vpnecomnotifier" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnui" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnui\vpnecomnotifier" source_size="0.3"/>
+ <component name="vpnmanagementui" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnui" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnui\vpnmanagementui" source_size="384089.1"/>
+ <component name="vpnpolicyrecognizer" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnui" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnui\vpnpolicyrecognizer" source_size="84162.9"/>
+ <component name="vpnpolins" old_model="s60" old_layer="complementary" old_package="VpnClient" old_collection="vpnui" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\complementary\VpnClient\vpnui\vpnpolins" source_size="134218.5"/>
+ </collection>
+ <collection name="vpn" id="vpn" long-name="VPN" level="api" contribution="contributed">
+ <component name="VpnAPI" old_model="s60" old_layer="mw" old_package="networking" old_collection="vpn" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\mw\networking\vpn\VpnAPI" source_size="229135.5"/>
+ </collection>
+ </block>
+ <block long-name="Messaging Middleware" tech_domain="pr" level="2" name="messagingmw" levels="unused fw api" contribution="contributed">
+ <collection name="messagingfw" long-name="Messaging Framework" id="Messaging Framework" level="fw" contribution="contributed">
+ <component name="alwaysonline" long-name="Always Online" id="alwaysonline" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\alwaysonline" source_size="268823.1"/>
+ <component name="msgcommonutils" long-name="Message Common Utils" id="msgcommonutils" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\msgcommonutils" source_size="364847.1"/>
+ <component name="scheduledsendmtm" original-name="Scheduled Send MTM" long-name="Scheduled Send MTM" id="Scheduled Send MTM" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Plugins" comment="" plugin="Y" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="421445">
+ <unit bldFile="mw/messagingmw/messagingfw/scheduledsendmtm/group" mrp="mw/messagingmw/messagingfw/scheduledsendmtm/group/messaging_schedulesend.mrp"/>
+ </component>
+ <component name="msgsrvnstore" original-name="Message Server and Store" long-name="Message Server and Store" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1100652">
+ <unit bldFile="mw/messagingmw/messagingfw/messageserverandstore/group" mrp="mw/messagingmw/messagingfw/messageserverandstore/group/messaging_framework.mrp"/>
+ </component>
+ <component name="biomsgfw" original-name="BIO Messaging Framework" long-name="BIO Messaging Framework" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1152120">
+ <unit bldFile="mw/messagingmw/messagingfw/biomessagingfw/group" mrp="mw/messagingmw/messagingfw/biomessagingfw/group/messaging_biomsg.mrp"/>
+ </component>
+ <component name="msgconf" original-name="Messaging Config" long-name="Messaging Config" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" class="config" introduced="9.4" contribution="contributed" in_production_device_rom="yes" source_size="8623">
+ <unit bldFile="mw/messagingmw/messagingfw/messagingconfig/group" mrp="mw/messagingmw/messagingfw/messagingconfig/group/messaging_config.mrp"/>
+ </component>
+ <component name="watcherfw" original-name="Watcher Framework" long-name="Watcher Framework" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="28214">
+ <unit bldFile="mw/messagingmw/messagingfw/watcherfw/group" mrp="mw/messagingmw/messagingfw/watcherfw/group/messaging_watcher.mrp"/>
+ </component>
+ <component name="msgtest" original-name="Messaging Test" long-name="Messaging Test" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" class="test" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1691871">
+ <unit bldFile="mw/messagingmw/messagingfw/messagingtest/group" mrp="mw/messagingmw/messagingfw/messagingtest/group/messaging_test.mrp"/>
+ </component>
+ <component name="msgtests" original-name="Messaging Tests" long-name="Messaging Tests" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" class="test" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1627003">
+ <unit mrp="mw/messagingmw/messagingfw/messagingtests/group/messaging.mrp"/>
+ </component>
+ <component name="msgtestproduct" original-name="Messaging Test Product" long-name="Messaging Test Product" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" class="test" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="5424101">
+ <unit mrp="mw/messagingmw/messagingfw/messagingtestproduct/group/messaging_testproduct.mrp"/>
+ </component>
+ <component name="biowatchers" original-name="BIO Watchers" long-name="BIO Watchers" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Services" comment="" plugin="Y" introduced="8.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="193476">
+ <unit bldFile="mw/messagingmw/messagingfw/biowatchers/Group" mrp="mw/messagingmw/messagingfw/biowatchers/Group/messaging_biomsg_biowatchers_cdma.mrp"/>
+ </component>
+ <component name="sendas" original-name="Send As" long-name="Send As" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Services" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="155008">
+ <unit bldFile="mw/messagingmw/messagingfw/sendas/group" mrp="mw/messagingmw/messagingfw/sendas/group/messaging_sendas2.mrp"/>
+ </component>
+ <component name="msgurlhandler" original-name="Message URL Handler" long-name="Message URL Handler" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Services" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="74709">
+ <unit bldFile="mw/messagingmw/messagingfw/messageurlhandler/group" mrp="mw/messagingmw/messagingfw/messageurlhandler/group/messaging_urlhandler.mrp"/>
+ </component>
+ <component name="wappushfw" original-name="WAP Push Framework" long-name="WAP Push Framework" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Services" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1199185">
+ <unit bldFile="mw/messagingmw/messagingfw/wappushfw/group" mrp="mw/messagingmw/messagingfw/wappushfw/group/wap-browser_wappush.mrp"/>
+ </component>
+ <component name="suplsmshandler" original-name="SUPL SMS Handler" long-name="SUPL SMS Handler" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Services" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="no">
+ <unit bldFile="os/unref/orphan/comgen/LBS/lbsexternaleventhandlers/suplsmstrigger/group" mrp="os/unref/orphan/comgen/LBS/lbsexternaleventhandlers/suplsmstrigger/group/lbs_suplsmstrigger.mrp"/>
+ </component>
+ <component name="suplwappushhandler" original-name="SUPL WAP Push Handler" long-name="SUPL WAP Push Handler" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Services" comment="" plugin="Y" introduced="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/LBS/lbsexternaleventhandlers/suplwappush/group" mrp="os/unref/orphan/comgen/LBS/lbsexternaleventhandlers/suplwappush/group/lbs_suplwappush.mrp"/>
+ </component>
+ </collection>
+ <collection name="msgbranched" id="msgbranched" long-name="Messaging Branched" level="fw" contribution="contributed">
+ <component name="msgbranched.lib=binary" old_model="s60" old_layer="osext" old_package="messagingextensions" old_collection="msgbranched" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\osext\messagingextensions\msgbranched\msgbranched.lib=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Instant Messaging and Presence Services" tech_domain="pr" level="1" name="imsrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="imservices" id="imservices" long-name="IM Services" level="generic" contribution="contributed">
+ <component name="instantmessagingcache" old_model="s60" old_layer="mw" old_package="conversationservices" old_collection="imservices" comment="" contribution="contributed"/>
+ <component name="xmppsettingsapi" old_model="s60" old_layer="mw" old_package="conversationservices" old_collection="imservices" comment="" contribution="contributed"/>
+ <component name="xmppsettingsfetcher" old_model="s60" old_layer="mw" old_package="conversationservices" old_collection="imservices" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="ximpfw" id="ximpfw" long-name="XIMP Framework" level="framework" contribution="contributed">
+ <component name="core" old_model="s60" old_layer="mw" old_package="conversationservices" old_collection="ximpfw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="presence" old_model="s60" old_layer="mw" old_package="conversationservices" old_collection="ximpfw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\ximpfw\presence" source_size="388223.7"/>
+ </collection>
+ <collection name="brandingserver" id="brandingserver" long-name="Branding Server" level="specific" contribution="contributed">
+ <component name="tools" old_model="s60" old_layer="mw" old_package="imppservices" old_collection="brandingserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\imppservices\brandingserver\tools" source_size="73377.0"/>
+ <component name="bsclient.dll=binary" old_model="s60" old_layer="mw" old_package="imppservices" old_collection="brandingserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\imppservices\brandingserver\bsclient.dll=binary" source_size="0.0"/>
+ <component name="bsserver.exe=binary" old_model="s60" old_layer="mw" old_package="imppservices" old_collection="brandingserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\imppservices\brandingserver\bsserver.exe=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Legacy Presence Services" tech_domain="pr" level="1" name="legacypresence" levels="fw engine ui" contribution="contributed">
+ <collection name="xdmengine" id="XDMEngine" long-name="XDM Engine" level="engine" contribution="contributed">
+ <component name="XdmSettingsApi" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="XDMEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\XDMEngine\XdmSettingsApi" source_size="10105.2"/>
+ <component name="XdmProvisioning" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="XDMEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\XDMEngine\XdmProvisioning" source_size="134236.8"/>
+ <component name="XdmDeviceManagement" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="XDMEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\XDMEngine\XdmDeviceManagement" source_size="256191.0"/>
+ <component name="XdmEngine.dll=binary" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="XDMEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\XDMEngine\XdmEngine.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="xdmsettingsui" id="XDMSettingsUI" long-name="XDM Settings UI" level="ui" contribution="contributed">
+ <component name="GSXDMPlugin.dll=binary" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="XDMSettingsUI" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\XDMSettingsUI\GSXDMPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="msgconnmanager" id="msgconnmanager" long-name="Messaging Connection Manager" level="fw" contribution="contributed">
+ <component name="msgconnmanager.dll=binary" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="msgconnmanager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\msgconnmanager\msgconnmanager.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="presencefwsimpleadpt" id="presencefwsimpleadpt" long-name="Presence Framework SIMPLE Adaptor" level="fw" contribution="contributed">
+ <component name="simpleplugin.dll=binary" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="presencefwsimpleadpt" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\presencefwsimpleadpt\simpleplugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="presencesettingsui" id="presencesettingsui" long-name="Presence Settings UI" level="ui" contribution="contributed">
+ <component name="psuigsplugin.dll=binary" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="presencesettingsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\presencesettingsui\psuigsplugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="simpleengine" id="simpleengine" long-name="SIMPLE Engine" level="engine" contribution="contributed">
+ <component name="engine" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="simpleengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="presencesettingsapi" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="simpleengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\simpleengine\presencesettingsapi" source_size="135245.1"/>
+ <component name="siputils" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="simpleengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\simpleengine\siputils" source_size="74785.8"/>
+ <component name="xmlutils" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="simpleengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\simpleengine\xmlutils" source_size="55360.2"/>
+ <component name="xdmrlspres" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="simpleengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\simpleengine\xdmrlspres" source_size="306174.6"/>
+ <component name="presencedm" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="simpleengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\simpleengine\presencedm" source_size="227814.3"/>
+ <component name="presenceprovisioning" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="simpleengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\simpleengine\presenceprovisioning" source_size="180282.9"/>
+ </collection>
+ <collection name="xdmprotocols" id="xdmprotocols" long-name="XDM Protocols" level="fw" contribution="contributed">
+ <component name="XdmXmlParser" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="xdmprotocols" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\xdmprotocols\XdmXmlParser" source_size="24933.9"/>
+ <component name="XcapProtocol" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="xdmprotocols" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\xdmprotocols\XcapProtocol" source_size="434699.1"/>
+ <component name="LocalProtocol" old_model="s60" old_layer="mw" old_package="presenceservices" old_collection="xdmprotocols" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\presenceservices\xdmprotocols\LocalProtocol" source_size="47972.7"/>
+ </collection>
+ </block>
+ <block long-name="Image Handling" tech_domain="mm" level="2" name="imghandling" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="3gplibrary" id="3gplibrary" long-name="3GP Library" level="server" contribution="contributed">
+ <component name="3GPMP4Lib" long-name="3GP MP4 Lib" id="3GPMP4Lib" old_model="s60" old_layer="mw" old_package="imagehandling" old_collection="3gplibrary" comment="" contribution="contributed" path="\s60\mw\imagehandling\3gplibrary\3GPMP4Lib" source_size="408874.5"/>
+ </collection>
+ <collection name="imagehandlinglib" id="ImageHandlingLib" long-name="Image Handling Library" level="generic" contribution="contributed">
+ <component name="IHL.dll=binary" old_model="s60" old_layer="mw" old_package="imagehandling" old_collection="ImageHandlingLib" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\imagehandling\ImageHandlingLib\IHL.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="imagehandlingutilities" id="imagehandlingutilities" long-name="Image Handling Utilities" level="specific" contribution="contributed">
+ <component name="imageinfopopup" old_model="s60" old_layer="mw" old_package="imagehandling" old_collection="imagehandlingutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\imagehandling\imagehandlingutilities\imageinfopopup" source_size="163982.1"/>
+ <component name="imagepreview" old_model="s60" old_layer="mw" old_package="imagehandling" old_collection="imagehandlingutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\imagehandling\imagehandlingutilities\imagepreview" source_size="346338.9"/>
+ <component name="thumbnailmanager" old_model="s60" old_layer="mw" old_package="imagehandling" old_collection="imagehandlingutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\imagehandling\imagehandlingutilities\thumbnailmanager" source_size="2985492.9"/>
+ <component name="tvoutengine" old_model="s60" old_layer="mw" old_package="imagehandling" old_collection="imagehandlingutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\imagehandling\imagehandlingutilities\tvoutengine" source_size="64521.6"/>
+ </collection>
+ </block>
+ <block long-name="Legacy Metadata Services" tech_domain="mm" level="2" name="metadatasrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="contentlistingframework" id="contentlistingframework" long-name="Content Listing Framework" level="framework" contribution="contributed">
+ <component name="CLFUtils.dll=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\contentlistingframework\CLFUtils.dll=binary" source_size="0.0"/>
+ <component name="CLFMimeTypeManager.dll=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\contentlistingframework\CLFMimeTypeManager.dll=binary" source_size="0.0"/>
+ <component name="CLFCollectionManagerImpl.dll=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\contentlistingframework\CLFCollectionManagerImpl.dll=binary" source_size="0.0"/>
+ <component name="CLFDefaultSource.dll=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\contentlistingframework\CLFDefaultSource.dll=binary" source_size="0.0"/>
+ <component name="CLFMetaDataManager.dll=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\contentlistingframework\CLFMetaDataManager.dll=binary" source_size="0.0"/>
+ <component name="ContentListingServer.exe=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\contentlistingframework\ContentListingServer.exe=binary" source_size="0.0"/>
+ <component name="MediaCollectionManager.dll=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="ContentListingFramework.dll=binary" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="contentlistingframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="mediamanagementuis" id="mediamanagementuis" long-name="Media Management UIs" level="server" contribution="contributed">
+ <component name="mediastylegrid" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="mediamanagementuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\mediamanagementuis\mediastylegrid" source_size="198525.9"/>
+ </collection>
+ <collection name="mediamanagementutilities" id="mediamanagementutilities" long-name="Media Management utilities" level="generic" contribution="contributed">
+ <component name="mediafetch" old_model="s60" old_layer="mw" old_package="mediamanagement" old_collection="mediamanagementutilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mediamanagement\mediamanagementutilities\mediafetch" source_size="123866.1"/>
+ </collection>
+ </block>
+ <block long-name="Metadata Services" tech_domain="mm" level="1" name="mds" levels="mgr eng int" contribution="contributed">
+ <collection name="clfwrapper" id="clfwrapper" long-name="CLF Wrapper" level="int" contribution="contributed">
+ <component name="MediaCollectionManager.dll=binary" old_model="s60" old_layer="mw" old_package="MDS" old_collection="clfwrapper" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="ContentListingFramework.dll=binary" old_model="s60" old_layer="mw" old_package="MDS" old_collection="clfwrapper" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="contextengine" id="contextengine" long-name="Context Engine" level="eng" contribution="contributed">
+ <component name="plugins" old_model="s60" old_layer="mw" old_package="MDS" old_collection="contextengine" comment="" contribution="contributed"/>
+ <component name="contextengine.dll=binary" old_model="s60" old_layer="mw" old_package="MDS" old_collection="contextengine" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="harvester" id="harvester" long-name="Harvester" level="eng" contribution="contributed">
+ <component name="blacklistclient" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ <component name="blacklistserver" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ <component name="client" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ <component name="common" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ <component name="composerplugins" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ <component name="harvesterplugins" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ <component name="monitorplugins" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ <component name="server" old_model="s60" old_layer="mw" old_package="MDS" old_collection="harvester" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="locationmanager" id="locationmanager" long-name="Location Manager" level="mgr" contribution="contributed">
+ <component name="client" old_model="s60" old_layer="mw" old_package="MDS" old_collection="locationmanager" comment="" contribution="contributed"/>
+ <component name="locationtrail" old_model="s60" old_layer="mw" old_package="MDS" old_collection="locationmanager" comment="" contribution="contributed"/>
+ <component name="server" old_model="s60" old_layer="mw" old_package="MDS" old_collection="locationmanager" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="metadataengine" id="metadataengine" long-name="Metadata Engine" level="eng" contribution="contributed">
+ <component name="client" old_model="s60" old_layer="mw" old_package="MDS" old_collection="metadataengine" comment="" contribution="contributed"/>
+ <component name="common" old_model="s60" old_layer="mw" old_package="MDS" old_collection="metadataengine" comment="" contribution="contributed"/>
+ <component name="server" old_model="s60" old_layer="mw" old_package="MDS" old_collection="metadataengine" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="Multimedia Middleware" tech_domain="mm" level="1" name="mmmw" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="radioutility" id="radioutility" long-name="Radio Utility" level="generic" contribution="contributed">
+ <component name="FMPresetUtility" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="radioutility" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\radioutility\FMPresetUtility" source_size="69999.6"/>
+ <component name="RadioServer" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="radioutility" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\radioutility\RadioServer" source_size="658148.7"/>
+ <component name="Radio_Utility" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="radioutility" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\radioutility\Radio_Utility" source_size="476339.1"/>
+ </collection>
+ <collection name="mtp" id="Mtp" long-name="MTP" level="framework" contribution="excluded" copyright_holder="Microsoft" license_status="open" license_type="commercial" source="no" ship_license_required="mandatory">
+ <component name="install" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="Mtp" comment="" contribution="excluded" copyright_holder="Microsoft" license_status="open" license_type="commercial" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\Mtp\install" source_size="4131.6"/>
+ <component name="MtpServer" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="Mtp" comment="" contribution="excluded" copyright_holder="Microsoft" license_status="open" license_type="commercial" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\Mtp\MtpServer" source_size="251267.4"/>
+ <component name="MtpUsbClass" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="Mtp" comment="" contribution="excluded" copyright_holder="Microsoft" license_status="open" license_type="commercial" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\Mtp\MtpUsbClass" source_size="3906.0"/>
+ </collection>
+ <collection name="audioeffectsui" id="audioeffectsui" long-name="Audio Effects UI" level="specific" contribution="contributed">
+ <component name="Equalizer" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioeffectsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioeffectsui\Equalizer" source_size="359292.6"/>
+ </collection>
+ <collection name="audioenhancements" id="audioenhancements" long-name="Audio Enhancements" level="generic" contribution="contributed">
+ <component name="AudioOutputControlUtility" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioenhancements\AudioOutputControlUtility" source_size="507283.2"/>
+ <component name="CallAudioControl" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed"/>
+ <component name="ConfigurationComponentsFactory" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioenhancements\ConfigurationComponentsFactory" source_size="34996.2"/>
+ <component name="EnhancedAudioPlayerUtility" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioenhancements\EnhancedAudioPlayerUtility" source_size="446757.9"/>
+ <component name="EnhancedMediaClient" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioenhancements\EnhancedMediaClient" source_size="1132663.8"/>
+ <component name="ProfileSettingsMonitor" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioenhancements\ProfileSettingsMonitor" source_size="88342.8"/>
+ <component name="ProgressiveDownload" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioenhancements\ProgressiveDownload" source_size="617112.6"/>
+ <component name="VoIPAudioServices" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="audioenhancements" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmenhs\audioenhancements\VoIPAudioServices" source_size="1045642.2"/>
+ </collection>
+ <collection name="metadatautility" id="MetaDataUtility" long-name="Metadata Utility" level="generic" contribution="contributed">
+ <component name="MetaDataUtility.dll=binary" old_model="s60" old_layer="mw" old_package="mmenhs" old_collection="MetaDataUtility" comment="Subcomponent 3GPExtParserLib delivered only as binary." contribution="partial" source="no" license_type="commercial" partial_contribution="yes"/>
+ </collection>
+ <collection name="advancedaudiocontroller" id="advancedaudiocontroller" long-name="Advanced Audio Controller" level="plugin" contribution="contributed">
+ <component name="AudioControllerPluginsVariant" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="advancedaudiocontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmplugins\advancedaudiocontroller\AudioControllerPluginsVariant" source_size="4201454.7"/>
+ <component name="WAVPlayControllerPlugin" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="advancedaudiocontroller" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmplugins\advancedaudiocontroller\WAVPlayControllerPlugin" source_size="61082.4"/>
+ </collection>
+ <collection name="thumbnailengine" id="thumbnailengine" long-name="Thumbnail Engine" level="server" contribution="excluded" copyright_holder="RealNetworks Inc." license="RPSL, RCSL, GPLv2" license_status="no" source="yes" ship_license_required="mandatory" license_type="commercial" partial_contribution="yes" comment="Parts copyright RealNetworks Inc. Should be refactored to move those files to Helix package.">
+ <component name="TNEEngine.dll=binary" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="thumbnailengine" comment="Parts copyright RealNetworks Inc. Should be refactored to move those files to Helix package." contribution="excluded" copyright_holder="RealNetworks Inc." license="RPSL, RCSL, GPLv2" license_status="no" source="yes" ship_license_required="mandatory" license_type="commercial" partial_contribution="yes" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmplugins\thumbnailengine\TNEEngine.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="gstreamer" id="gstreamer" long-name="GStreamer" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS">
+ <component name="gstreamer_core" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="gstreamer" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS"/>
+ <component name="gst_plugins_base" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="gstreamer" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS"/>
+ <component name="gst_plugins_good" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="gstreamer" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS"/>
+ <component name="gst_plugins_symbian" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="gstreamer" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_type="OSS"/>
+ </collection>
+ <collection name="drmmmfapitestapp" id="DrmMmfApiTestApp" long-name="DRM MMF API Test App" level="specific" contribution="contributed">
+ <component name="DRMUtilApp.exe=binary" old_model="s60" old_layer="test" old_package="mmtest" old_collection="DrmMmfApiTestApp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="mmmiddlewarefws" original-name="Multimedia Middleware Frameworks" long-name="Multimedia Middleware Frameworks" id="Multimedia Middleware Frameworks" level="server" contribution="contributed">
+ <component name="mmfw" original-name="Multimedia Framework" long-name="Multimedia Framework" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="836688">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/group" mrp="mw/mmmw/mmmiddlewarefws/mmfw/group/multimedia_mmf.mrp"/>
+ </component>
+ <component name="mmutilitylib" original-name="Multimedia Utility Library" long-name="Multimedia Utility Library" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="12019">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmutilitylib/group" mrp="mw/mmmw/mmmiddlewarefws/mmutilitylib/group/multimedia_common.mrp"/>
+ </component>
+ <component name="metadatautilityfw" original-name="Metadata Utility Framework" long-name="Metadata Utility Framework" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" introduced="9.5" contribution="excluded" not_used_by_s60="" export_restricted="no" license_type="commercial" copyright_holder="Sony Ericsson Mobile Communications AB" license_status="No" ship_license="Mandatory" source="no" partial_contribution="no" license="Sony Ericsson Mobile Communications AB" in_production_device_rom="no" platform_critical="no" source_size="26244">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/muf/metadataframework/group" mrp="os/unref/orphan/comgen/multimedia/muf/metadataframework/group/multimedia_muf.mrp"/>
+ </component>
+ <component name="broadcastradiotuner" original-name="Broadcast Radio Tuner" long-name="Broadcast Radio Tuner" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" introduced="9.1" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="78304">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/broadcastradiotuner/group" mrp="mw/mmmw/mmmiddlewarefws/broadcastradiotuner/group/multimedia_tuner.mrp"/>
+ </component>
+ <component name="broadcastradiotransmitter" original-name="Broadcast Radio Transmitter" long-name="Broadcast Radio Transmitter" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="21555">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/transmitter/framework/group" mrp="os/unref/orphan/comgen/multimedia/transmitter/framework/group/multimedia_transmitter.mrp"/>
+ </component>
+ <component name="mufunittests" original-name="MUF Unit Tests" long-name="MUF Unit Tests" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="2393597">
+ <unit mrp="os/unref/orphan/comgen/multimedia/unittest/muf/group/multimedia_unittest_muf_source.mrp"/>
+ </component>
+ <component name="mufintegrationtests" original-name="MUF Integration Tests" long-name="MUF Integration Tests" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1836232">
+ <unit mrp="os/unref/orphan/comgen/multimedia/inttest/muf/group/multimedia_inttest_muf_source.mrp"/>
+ </component>
+ <component name="tunerunittests" original-name="Tuner Unit Tests" long-name="Tuner Unit Tests" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" class="test" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="7206">
+ <unit mrp="mw/mmmw/mmmiddlewarefws/tunerunittests/group/multimedia_unittest_tuner_source.mrp"/>
+ </component>
+ <component name="broadcastradiotransmitterunittests" original-name="Broadcast Radio Transmitter Unit Tests" long-name="Broadcast Radio Transmitter Unit Tests" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="16921">
+ <unit mrp="os/unref/orphan/comgen/multimedia/unittest/transmitter/group/multimedia_unittest_transmitter_source.mrp"/>
+ </component>
+ <component name="broadcastradiotransmitterintegrationtests" original-name="Broadcast Radio Transmitter Integration Tests" long-name="Broadcast Radio Transmitter Integration Tests" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Frameworks" comment="" class="test" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="16765">
+ <unit mrp="os/unref/orphan/comgen/multimedia/inttest/transmitter/group/multimedia_inttest_transmitter_source.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmmiddlewareplugins" original-name="Multimedia Middleware Plugins" long-name="Multimedia Middleware Plugins" id="Multimedia Middleware Plugins" level="framework" contribution="contributed">
+ <component name="metadataparserplugin" original-name="Metadata Parser Plugin" long-name="Metadata Parser Plugin" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Plugins" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="50859">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/muf/metadataparser/group" mrp="os/unref/orphan/comgen/multimedia/muf/metadataparser/group/metadata_parser_plugin.mrp"/>
+ </component>
+ <component name="mmfwplugins" original-name="Multimedia Framework Plugins" long-name="Multimedia Framework Plugins" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Plugins" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="173099">
+ <unit bldFile="mw/mmmw/mmmiddlewarefws/mmfw/group_plugin" mrp="mw/mmmw/mmmiddlewarefws/mmfw/group_plugin/multimedia_mmf_plugin.mrp"/>
+ </component>
+ <component name="broadcastradiotransmitterplugin" original-name="Broadcast Radio Transmitter Plugin" long-name="Broadcast Radio Transmitter Plugin" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Middleware Plugins" comment="" plugin="Y" introduced="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="9445">
+ <unit bldFile="os/unref/orphan/comgen/multimedia/transmitter/plugin/group" mrp="os/unref/orphan/comgen/multimedia/transmitter/plugin/group/multimedia_transmitter_plugin.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmfwtest" original-name="Multimedia Framework Test" long-name="Multimedia Framework Test" id="Multimedia Framework Test" level="server" contribution="contributed">
+ <component name="mmfunittests" original-name="MMF Unit Tests" long-name="MMF Unit Tests" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Framework Test" comment="" class="test" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="31122679">
+ <unit mrp="mw/mmmw/mmfwtest/mmfunittests/group/multimedia_unittest_mmf_source.mrp"/>
+ </component>
+ <component name="mmfintegrationtests" original-name="MMF Integration Tests" long-name="MMF Integration Tests" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Framework Test" comment="" class="test" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="4019548">
+ <unit mrp="mw/mmmw/mmfwtest/mmfintegrationtests/group/multimedia_inttest_mmf_source.mrp"/>
+ </component>
+ <component name="mmfcharacterisationvalidation" original-name="MMF Characterisation Validation" long-name="MMF Characterisation Validation" old_model="MCL" old_layer="Generic Middleware" old_package="Multimedia Middleware" old_collection="Multimedia Framework Test" comment="" class="test" introduced="9.3" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="4314725">
+ <unit bldFile="mw/mmmw/mmfwtest/mmfcharacterisationvalidation/group" mrp="mw/mmmw/mmfwtest/mmfcharacterisationvalidation/group/multimedia_mmf_char.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmvalidationsuite" original-name="Multimedia Validation Suite" long-name="Multimedia Validation Suite" id="Multimedia Validation Suite" level="specific" contribution="contributed">
+ <component name="mmvalidationsuiteapp" original-name="Multimedia Validation Suite Application" long-name="Multimedia Validation Suite Application" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Multimedia Validation Suite" comment="" class="test" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="106806">
+ <unit bldFile="mw/mmmw/mmvalidationsuite/mmvalidationsuiteapp/group" mrp="mw/mmmw/mmvalidationsuite/mmvalidationsuiteapp/group/multimedia_mvs_app.mrp"/>
+ </component>
+ <component name="mmvalidationsuiteagents" original-name="Multimedia Validation Suite Agents" long-name="Multimedia Validation Suite Agents" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Multimedia Validation Suite" comment="" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="49573">
+ <unit bldFile="mw/mmmw/mmvalidationsuite/mmvalidationsuiteagents/group" mrp="mw/mmmw/mmvalidationsuite/mmvalidationsuiteagents/group/multimedia_mvs_agents.mrp"/>
+ </component>
+ <component name="mvsintegrationtests" original-name="MVS Integration Tests" long-name="MVS Integration Tests" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Multimedia Validation Suite" comment="" class="test" introduced="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1667009">
+ <unit mrp="mw/mmmw/mmvalidationsuite/mvsintegrationtests/group/multimedia_inttest_mvs_source.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Multimedia UI Framework" tech_domain="mm" level="1" name="mmuifw" levels="mgr mdl util ui" contribution="contributed">
+ <collection name="alfwidgetutils" id="alfwidgetutils" long-name="ALF Widget Utils" level="ui" contribution="contributed">
+ <component name="alfwidgetutils.dll=binary" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="alfwidgetutils" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="declarativeui" id="declarativeui" long-name="Declarative UI" level="util" contribution="contributed">
+ <component name="declarativeuiengine" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="declarativeui" comment="" contribution="contributed"/>
+ <component name="interpreter" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="declarativeui" comment="" contribution="contributed"/>
+ <component name="node" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="declarativeui" comment="" contribution="contributed"/>
+ <component name="nodeiterator" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="declarativeui" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="lctmanagement" id="lctmanagement" long-name="LCT Management" level="mgr" contribution="contributed">
+ <component name="lctmanager" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="lctmanagement" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="mulwidgets" id="mulwidgets" long-name="MUL Widgets" level="ui" contribution="contributed">
+ <component name="alfcontainerwidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="alfscrollbarwidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="alfviewwidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="common" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="gesturehelper" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="mulcoverflowwidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="muldatamodel" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="mulgridwidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="mullistwidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="mullogging" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="mulmetapanewidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="mulsliderwidget" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ <component name="performancetest" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="mulwidgets" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="osncore" id="osncore" long-name="OSN Core" level="util" contribution="contributed">
+ <component name="osncore" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="osncore" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="resourcepool" id="resourcepool" long-name="Resource Pool" level="util" contribution="contributed">
+ <component name="alfresourcepool.dll=binary" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="resourcepool" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="thememanagement" id="thememanagement" long-name="Theme Management" level="mgr" contribution="contributed">
+ <component name="skindata" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="thememanagement" comment="" contribution="contributed"/>
+ <component name="ThemeManager" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="thememanagement" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="uimodel" id="uimodel" long-name="UI Model" level="mdl" contribution="contributed">
+ <component name="uimodel compo" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="uimodel" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="widgetmodel" id="widgetmodel" long-name="Widget Model" level="mdl" contribution="contributed">
+ <component name="alfcustomlayoutmanagers" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="widgetmodel" comment="" contribution="contributed"/>
+ <component name="alfwidgetfactory" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="widgetmodel" comment="" contribution="contributed"/>
+ <component name="alfwidgetmodel" old_model="s60" old_layer="mw" old_package="mmuifw" old_collection="widgetmodel" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="Mobile TV Services" tech_domain="mm" level="1" name="mobiletv" levels="specific" contribution="contributed">
+ <collection name="gba" id="gba" long-name="GBA" level="specific" contribution="contributed">
+ <component name="bootstrap" old_model="s60" old_layer="mw" old_package="mtv_streaming_services" old_collection="gba" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\gba\bootstrap" source_size="33363.6"/>
+ <component name="GBAAPI" old_model="s60" old_layer="mw" old_package="mtv_streaming_services" old_collection="gba" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\gba\GBAAPI" source_size="6402.3"/>
+ <component name="GBAFilter" old_model="s60" old_layer="mw" old_package="mtv_streaming_services" old_collection="gba" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\gba\GBAFilter" source_size="19432.5"/>
+ <component name="GbaServer" old_model="s60" old_layer="mw" old_package="mtv_streaming_services" old_collection="gba" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\gba\GbaServer" source_size="12619.2"/>
+ <component name="uicc" old_model="s60" old_layer="mw" old_package="mtv_streaming_services" old_collection="gba" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\securityservices\gba\uicc" source_size="17098.5"/>
+ </collection>
+ </block>
+ <block long-name="Helix" tech_domain="mm" level="2" name="helix" levels="plugin framework server generic specific" contribution="contributed" copyright_holder="Real Networks" license="RPSL, RCSL, GPLv2" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory">
+ <collection name="helix_ren" id="helix" long-name="Helix" level="framework" contribution="excluded" copyright_holder="Real Networks" license="RPSL, RCSL, GPLv2" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory">
+ <component name="HelixRFSPlugin" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="helix" comment="" contribution="excluded" copyright_holder="Real Networks" license="RPSL, RCSL, GPLv2" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmplugins\helix\HelixRFSPlugin" source_size="2986.5"/>
+ <component name="helix_binary" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="helix" comment="" contribution="excluded" copyright_holder="Real Networks" license="RPSL, RCSL, GPLv2" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmplugins\helix\helix_binary" source_size="6827.4"/>
+ <component name="src" old_model="s60" old_layer="mw" old_package="mmplugins" old_collection="helix" comment="" contribution="excluded" copyright_holder="Real Networks" license="RPSL, RCSL, GPLv2" license_type="commercial" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ </block>
+ <block long-name="Video Utils" tech_domain="mm" level="2" name="videoutils" levels="empty eng util" contribution="contributed">
+ <collection name="dvrengine" id="dvrengine" long-name="DVR Engine" level="eng" contribution="contributed">
+ <component name="CommonRecordingEngine" old_model="s60" old_layer="mw" old_package="videoserviceutils" old_collection="dvrengine" comment="" contribution="contributed"/>
+ <component name="CommonRecordingEngineClient" old_model="s60" old_layer="mw" old_package="videoserviceutils" old_collection="dvrengine" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="videoconnutility" id="videoconnutility" long-name="Video Conn Utility" level="util" contribution="contributed">
+ <component name="connutilpsworker" old_model="s60" old_layer="mw" old_package="videoserviceutils" old_collection="videoconnutility" comment="" contribution="contributed"/>
+ <component name="vcxconnectionutility.dll=binary" old_model="s60" old_layer="mw" old_package="videoserviceutils" old_collection="videoconnutility" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="videoscheduler" id="videoscheduler" long-name="Video Scheduler" level="util" contribution="contributed">
+ <component name="SchedulerClient" old_model="s60" old_layer="mw" old_package="videoserviceutils" old_collection="videoscheduler" comment="" contribution="contributed"/>
+ <component name="SchedulerServer" old_model="s60" old_layer="mw" old_package="videoserviceutils" old_collection="videoscheduler" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="Camera Services" tech_domain="mm" level="2" name="camerasrv" levels="unused plugin fw api" contribution="contributed">
+ <collection name="camappengine" id="CamAppEngine" long-name="Camera App Engine" level="fw" contribution="contributed">
+ <component name="asynchfilesavequeue" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamAppEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\cameraengines\CamAppEngine\asynchfilesavequeue" source_size="116768.4"/>
+ <component name="Build" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamAppEngine" comment="" contribution="contributed"/>
+ <component name="StillConverter" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamAppEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\cameraengines\CamAppEngine\StillConverter" source_size="17048.1"/>
+ <component name="Engine" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamAppEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\cameraengines\CamAppEngine\Engine" source_size="137783.7"/>
+ </collection>
+ <collection name="camcordermmfplugin" id="CamcorderMMFPlugin" long-name="Camcorder MMFPlugin" level="plugin" contribution="contributed">
+ <component name="Build" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamcorderMMFPlugin" comment="" contribution="contributed"/>
+ <component name="MediaRecorder" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamcorderMMFPlugin" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\cameraengines\CamcorderMMFPlugin\MediaRecorder" source_size="292386.6"/>
+ <component name="FileComposer" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamcorderMMFPlugin" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\cameraengines\CamcorderMMFPlugin\FileComposer" source_size="60474.0"/>
+ <component name="Controller" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="CamcorderMMFPlugin" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\cameraengines\CamcorderMMFPlugin\Controller" source_size="51581.7"/>
+ </collection>
+ <collection name="configmanagers" id="configmanagers" long-name="Config Managers" level="api" contribution="contributed">
+ <component name="imagingconfigmanager" old_model="s60" old_layer="mw" old_package="cameraengines" old_collection="configmanagers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\cameraengines\configmanagers\imagingconfigmanager" source_size="889728.0"/>
+ </collection>
+ </block>
+ <block long-name="Multimedia App Framework" tech_domain="mm" level="2" name="mmappfw" levels="empty fw utils" contribution="contributed">
+ <collection name="mmappcomponents" id="mmappcomponents" long-name="MM App Components" level="utils" contribution="contributed">
+ <component name="AsxParser" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mmappcomponents" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mmappcomponents\AsxParser" source_size="0.0"/>
+ <component name="collectionhelper" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mmappcomponents" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mmappcomponents\collectionhelper" source_size="99003.3"/>
+ <component name="harvester" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mmappcomponents" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mmappcomponents\harvester" source_size="204281.7"/>
+ <component name="mmappcommonui" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mmappcomponents" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mmappcomponents\mmappcommonui" source_size="22623.9"/>
+ <component name="playlistengine" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mmappcomponents" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mmappcomponents\playlistengine" source_size="58335.9"/>
+ </collection>
+ <collection name="mpx" id="mpx" long-name="MPX" level="fw" contribution="contributed">
+ <component name="collectionframework" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mpx" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mpx\collectionframework" source_size="167676.0"/>
+ <component name="commonframework" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mpx" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mpx\commonframework" source_size="152102.4"/>
+ <component name="playbackframework" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mpx" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\mmappservices\mpx\playbackframework" source_size="158905.2"/>
+ <component name="viewframework" old_model="s60" old_layer="mw" old_package="mmappservices" old_collection="mpx" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ </block>
+ <block long-name="Input Methods" tech_domain="ui" level="2" name="inputmethods" levels="plugin engine framework" contribution="contributed">
+ <collection name="textinput" id="textinput" long-name="Text Input" level="framework" contribution="contributed">
+ <component name="PtiT9Core" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="The itegration layer for Nuance T9. No languages or binary SW for ARM included. Can be licensed from Nuance. T9 APIs can be reverse engineered from this SW." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\PtiT9Core" source_size="199621.5"/>
+ <component name="AknInputLanguage" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="Should be deprecated. Only in the release because of SDK binary compatibility." contribution="contributed" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\AknInputLanguage" source_size="8029.5"/>
+ <component name="GSLangPlugin" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\GSLangPlugin" source_size="61360.5"/>
+ <component name="Matsutake" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="Implements the same functionality as atok (Just Systems). Only Windows emulator binaries delivered. Arm binaries in minimum needed for Foundation." contribution="excluded" copyright_holder="K3" license="S60 OEM R&D" license_status="no" source="no" license_type="commercial" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\Matsutake" source_size="2658335.1"/>
+ <component name="ocrsrv" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="More info needed." contribution="excluded" copyright_holder="Beijing Hang Wang Technology Co. Ltd." license="S60 OEM R&D" license_status="no" source="no" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\ocrsrv" source_size="4124838.6"/>
+ <component name="peninputarc" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputarc" source_size="4141764.9"/>
+ <component name="peninputcommonctrls" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputcommonctrls" source_size="681418.2"/>
+ <component name="peninputcommonctrlsjp" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputcommonctrlsjp" source_size="454065.3"/>
+ <component name="peninputcommonlayout" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputcommonlayout" source_size="1991527.2"/>
+ <component name="peninputgenerichwr" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputgenerichwr" source_size="510221.4"/>
+ <component name="peninputgenericitut" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputgenericitut" source_size="130527.3"/>
+ <component name="peninputgenericvkb" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputgenericvkb" source_size="2238561.0"/>
+ <component name="peninputhwrboxcn" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputhwrboxcn" source_size="785013.3"/>
+ <component name="peninputhwrboxjp" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputhwrboxjp" source_size="323038.8"/>
+ <component name="peninputhwrfscn" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputhwrfscn" source_size="1096955.7"/>
+ <component name="peninputhwrtrui" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputhwrtrui" source_size="375680.7"/>
+ <component name="peninputvkbcn" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputvkbcn" source_size="1362594.6"/>
+ <component name="peninputvkbjp" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\peninputvkbjp" source_size="349793.1"/>
+ <component name="PtiAtokCore" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="Integration layer for atok. Analogous to T9 case." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\PtiAtokCore" source_size="1010207.1"/>
+ <component name="pticpicore" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\pticpicore" source_size="3087519.9"/>
+ <component name="ptidecumacore" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed"/>
+ <component name="PtiDecumaJpCore" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="Contains the integration layer in source and engine binaries. We might have a global license for R&D use." contribution="excluded" copyright_holder="Zi Corporation" license="S60 OEM R&D" license_status="no" source="no" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\PtiDecumaJpCore" source_size="393958.2"/>
+ <component name="PtiEngine" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="Deprecated. Shall be replaced by the ptienginev2." contribution="contributed" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\PtiEngine" source_size="571941.3"/>
+ <component name="ptienginev2" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\ptienginev2" source_size="0.0"/>
+ <component name="ptihanwangcore" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="More info needed." contribution="excluded" source="no" copyright_holder="Beijing Hang Wang Technology Co. Ltd." license_type="commercial" license="S60 OEM R&D" license_status="open" ship_license_required="mandatory" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\ptihanwangcore" source_size="1087019.4"/>
+ <component name="ptiindicphoneticcore" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\ptiindicphoneticcore" source_size="209366.7"/>
+ <component name="ptivocore" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="Contains our integration layer as source and Vision Objects binaries." contribution="excluded" source="no" copyright_holder="Vision Objects" license_status="open" license="S60 R&D" ship_license_required="mandatory" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\ptivocore" source_size="3447285.0"/>
+ <component name="ptixt9core" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="The itegration layer for Nuance qwerty T9. No languages or binary SW for ARM included. Can be licensed from Nuance. T9 APIs can be reverse engineered from this SW." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\ptixt9core" source_size="0.0"/>
+ </collection>
+ <collection name="fep" level="engine" contribution="contributed">
+ <component name="aknfep" long-name="AKN FEP" id="aknfep" old_model="s60" old_layer="mw" old_package="inputmethods" old_collection="textinput" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\inputmethods\textinput\aknfep" source_size="7478027.7"/>
+ <component name="frontendprocessor" original-name="Front End Processor" long-name="Front End Processor" id="Front End Processor" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="144880">
+ <unit bldFile="mw/inputmethods/fep/frontendprocessor/group" mrp="mw/inputmethods/fep/frontendprocessor/group/app-framework_fepbase.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Classic UI" tech_domain="ui" level="2" name="classicui" levels="base support server generic specific" contribution="contributed">
+ <collection name="psln" id="Psln" long-name="Personalization" level="specific" contribution="contributed">
+ <component name="pslnengine" old_model="s60" old_layer="mw" old_package="classicui" old_collection="Psln" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\classicui\Psln\pslnengine" source_size="51902.4"/>
+ <component name="PslnFramework" old_model="s60" old_layer="mw" old_package="classicui" old_collection="Psln" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\classicui\Psln\PslnFramework" source_size="16504.2"/>
+ <component name="pslnlibraryloaders" old_model="s60" old_layer="mw" old_package="classicui" old_collection="Psln" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\classicui\Psln\pslnlibraryloaders" source_size="11538.6"/>
+ <component name="pslnslidesetdialog" old_model="s60" old_layer="mw" old_package="classicui" old_collection="Psln" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\classicui\Psln\pslnslidesetdialog" source_size="37998.3"/>
+ <component name="PslnGSPlugin" old_model="s60" old_layer="mw" old_package="classicui" old_collection="Psln" comment="" contribution="contributed"/>
+ <component name="psln.exe=binary" old_model="s60" old_layer="mw" old_package="classicui" old_collection="Psln" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\classicui\Psln\psln.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="applicationinterworkingfw" id="applicationinterworkingfw" long-name="Application interworking Framwork" level="generic" contribution="contributed">
+ <component name="ServiceHandler" old_model="s60" old_layer="mw" old_package="classicui" old_collection="applicationinterworkingfw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\applicationinterworkingfw\ServiceHandler" source_size="785130.0"/>
+ </collection>
+ <collection name="commonuis" id="commonuis" long-name="Common UIs" level="specific" contribution="contributed">
+ <component name="CommonDialogs" old_model="s60" old_layer="mw" old_package="classicui" old_collection="commonuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\commonuis\CommonDialogs" source_size="470359.8"/>
+ <component name="CommonUi" old_model="s60" old_layer="mw" old_package="classicui" old_collection="commonuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\commonuis\CommonUi" source_size="2163105.0"/>
+ </collection>
+ <collection name="uifw" id="uifw" long-name="Uifw" level="server" contribution="contributed">
+ <component name="tactilefeedback" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uifw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uifw\tactilefeedback" source_size="1420460.7"/>
+ <component name="AknGlobalUI" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uifw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uifw\AknGlobalUI" source_size="886812.3"/>
+ <component name="AvKon" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uifw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uifw\AvKon" source_size="15604251.0"/>
+ <component name="eikctl" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uifw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uifw\eikctl" source_size="205352.7"/>
+ <component name="EikStd" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uifw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uifw\EikStd" source_size="1569225.9"/>
+ <component name="uiklaf" old_model="s60" old_layer="mw" old_package="classicui" old_collection="uifw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\classicui\uifw\uiklaf" source_size="91744.8"/>
+ </collection>
+ <collection name="commonuisupport" original-name="Common UI Support" long-name="Common UI Support" id="Common UI Support" level="support" contribution="contributed">
+ <component name="uikon" original-name="UIKON" long-name="UIKON" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Common UI Support" comment="" introduced="6.0" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="1765317">
+ <unit bldFile="mw/classicui/commonuisupport/uikon/group" mrp="mw/classicui/commonuisupport/uikon/group/app-framework_uikon.mrp"/>
+ </component>
+ <component name="errorresolverdata" original-name="Error Resolver Data" long-name="Error Resolver Data" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Common UI Support" comment="" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="3298">
+ <unit bldFile="mw/classicui/commonuisupport/errorresolverdata/group" mrp="mw/classicui/commonuisupport/errorresolverdata/group/app-framework_errorresgt.mrp"/>
+ </component>
+ <component name="uilaf" original-name="UI Look and Feel" long-name="UI Look and Feel" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Common UI Support" comment="" introduced="6.0" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="28427">
+ <unit bldFile="mw/classicui/commonuisupport/uilaf/GROUP" mrp="mw/classicui/commonuisupport/uilaf/GROUP/app-framework_uiklafgt.mrp"/>
+ </component>
+ <component name="grid" original-name="Grid" long-name="Grid" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Common UI Support" comment="" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="123461">
+ <unit bldFile="mw/classicui/commonuisupport/grid/group" mrp="mw/classicui/commonuisupport/grid/group/app-framework_grid.mrp"/>
+ </component>
+ <component name="uifwsdocs" original-name="UI Frameworks Documentation" long-name="UI Frameworks Documentation" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Common UI Support" comment="" class="doc" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="7089958">
+ <unit mrp="mw/classicui/commonuisupport/uifwsdocs/app-framework_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="lafagnosticuifoundation" original-name="Look-and-Feel Agnostic UI Foundation" long-name="Look-and-Feel Agnostic UI Foundation" id="Look-and-Feel Agnostic UI Foundation" level="base" contribution="contributed">
+ <component name="cone" original-name="Control Environment" long-name="Control Environment" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="484491">
+ <unit bldFile="mw/classicui/lafagnosticuifoundation/cone/group" mrp="mw/classicui/lafagnosticuifoundation/cone/group/app-framework_cone.mrp"/>
+ </component>
+ <component name="graphicseffects" original-name="Graphics Effects" long-name="Graphics Effects" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" introduced="9.2" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="54570">
+ <unit bldFile="mw/classicui/lafagnosticuifoundation/graphicseffects/group" mrp="mw/classicui/lafagnosticuifoundation/graphicseffects/group/app-framework_gfxtranseffect.mrp"/>
+ </component>
+ <component name="uigraphicsutils" original-name="UI Graphics Utilities" long-name="UI Graphics Utilities" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes" source_size="140055">
+ <unit bldFile="mw/classicui/lafagnosticuifoundation/uigraphicsutils/group" mrp="mw/classicui/lafagnosticuifoundation/uigraphicsutils/group/app-framework_egul.mrp"/>
+ </component>
+ <component name="clockanim" original-name="Clock" long-name="Clock" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" plugin="Y" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="81225">
+ <unit bldFile="mw/classicui/lafagnosticuifoundation/clockanim/group" mrp="mw/classicui/lafagnosticuifoundation/clockanim/group/app-framework_clock.mrp"/>
+ </component>
+ <component name="bmpanimation" original-name="BMP Animation" long-name="BMP Animation" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" introduced="6.0" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="236736">
+ <unit bldFile="mw/classicui/lafagnosticuifoundation/bmpanimation/group" mrp="mw/classicui/lafagnosticuifoundation/bmpanimation/group/app-framework_bmpanim.mrp"/>
+ </component>
+ <component name="animation" original-name="Animation" long-name="Animation" old_model="MCL" old_layer="Generic Middleware" old_package="System GUI Framework" old_collection="Look-and-Feel Agnostic UI Foundation" comment="" introduced="9.1" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="181676">
+ <unit bldFile="mw/classicui/lafagnosticuifoundation/animation/group" mrp="mw/classicui/lafagnosticuifoundation/animation/group/app-framework_animation.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="SVG Tiny" tech_domain="ui" level="2" name="svgt" levels="util ui" contribution="contributed">
+ <collection name="svgtopt" id="SVGTopt" long-name="SVGT Opt" level="util" contribution="contributed">
+ <component name="SVG" old_model="s60" old_layer="mw" old_package="graphics" old_collection="SVGTopt" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\graphics\SVGTopt\SVG" source_size="932306.7"/>
+ <component name="SVGEngineJI" old_model="s60" old_layer="mw" old_package="graphics" old_collection="SVGTopt" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\graphics\SVGTopt\SVGEngineJI" source_size="66064.5"/>
+ <component name="SVGTPlugin" old_model="s60" old_layer="mw" old_package="graphics" old_collection="SVGTopt" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\graphics\SVGTopt\SVGTPlugin" source_size="56430.9"/>
+ </collection>
+ </block>
+ <block long-name="UI Accelerator" tech_domain="ui" level="2" name="uiaccelerator" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="uiacceltk" id="uiacceltk" long-name="Uiacceltk" level="framework" contribution="contributed">
+ <component name="hitchcock" old_model="s60" old_layer="mw" old_package="uiaccelerator" old_collection="uiacceltk" comment="A lot of new development ongoing for 9.2 (NGA migration)" contribution="contributed" in_production_device_rom="" platform_critical="yes" not_used_by_s60="" path="\s60\mw\uiaccelerator\uiacceltk\hitchcock" source_size="28299190.2"/>
+ <component name="widgeteditors" old_model="s60" old_layer="mw" old_package="uiaccelerator" old_collection="uiacceltk" comment="Only a proto in 5.0 shall be replaced by antriksh in 9.1." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiaccelerator\uiacceltk\widgeteditors" source_size="88211.7"/>
+ </collection>
+ <collection name="uiaccelexampleapps" id="exampleapps" long-name="UI Accelerator Example Apps" level="specific" contribution="contributed">
+ <component name="alfexanalogdialer" old_model="s60" old_layer="mw" old_package="uiaccelerator" old_collection="exampleapps" comment="" contribution="contributed"/>
+ <component name="alfexstickers" old_model="s60" old_layer="mw" old_package="uiaccelerator" old_collection="exampleapps" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="UI Resources" tech_domain="ui" level="1" name="uiresources" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="layouts" id="layouts" long-name="Layouts" level="plugin" contribution="contributed">
+ <component name="aknlayout2" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="layouts" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\layouts\aknlayout2" source_size="57154306.5"/>
+ <component name="cdl" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="layouts" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\layouts\cdl" source_size="649959.9"/>
+ </collection>
+ <collection name="locales" id="locales" long-name="Locales" level="framework" contribution="contributed">
+ <component name="loce32" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="locales" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\locales\loce32" source_size="4225151.7"/>
+ </collection>
+ <collection name="pictographs" id="pictographs" long-name="Pictographs" level="specific" contribution="contributed">
+ <component name="AknPictograph" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="pictographs" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\pictographs\AknPictograph" source_size="888224.1"/>
+ </collection>
+ <collection name="skins" id="skins" long-name="Skins" level="specific" contribution="contributed">
+ <component name="AknSkinContent" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="skins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\skins\AknSkinContent" source_size="5182440.6"/>
+ <component name="AknSkins" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="skins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\skins\AknSkins" source_size="5508081.3"/>
+ </collection>
+ <collection name="uiconfig" id="uiconfig" long-name="UI Config" level="server" contribution="contributed">
+ <component name="s60config" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uiconfig" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uiconfig\s60config" source_size="18755274.0"/>
+ </collection>
+ <collection name="uigraphics" id="uigraphics" long-name="UI Graphics" level="generic" contribution="contributed">
+ <component name="AknIcon" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\AknIcon" source_size="603800.4"/>
+ <component name="Bitmaps2" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\Bitmaps2" source_size="785918.4"/>
+ <component name="Icons" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\Icons" source_size="26208017.1"/>
+ <component name="palette" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\palette" source_size="193441.2"/>
+ <component name="VariatedBitmaps" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\VariatedBitmaps" source_size="2820.9"/>
+ </collection>
+ <collection name="fontsupport" level="generic" contribution="contributed">
+ <component name="FontProvider" long-name="Font Provider" id="FontProvider" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\FontProvider" source_size="49970.4"/>
+ <component name="fonts" long-name="Fonts" id="fonts" old_model="s60" old_layer="mw" old_package="uiresources" old_collection="uigraphics" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uiresources\uigraphics\fonts" source_size="4182460.8"/>
+ </collection>
+ </block>
+ <block long-name="Home Screen Services" tech_domain="ui" level="1" name="homescreensrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="contenpublishingsrv" id="contentpublishingservice" long-name="Content Publishing Service" level="server" contribution="contributed">
+ <component name="contentharvester" old_model="s60" old_layer="mw" old_package="uishellservices" old_collection="contentpublishingservice" comment="" contribution="contributed"/>
+ <component name="contentpublishingserver" old_model="s60" old_layer="mw" old_package="uishellservices" old_collection="contentpublishingservice" comment="" contribution="contributed"/>
+ <component name="contentpublishingutils" old_model="s60" old_layer="mw" old_package="uishellservices" old_collection="contentpublishingservice" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="backsteppingsrv" id="backsteppingservice" long-name="Backstepping Service" level="server" contribution="contributed">
+ <component name="bsengine.exe=binary" old_model="s60" old_layer="mw" old_package="uishellservices" old_collection="backsteppingservice" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="xcfw" id="xcfw" long-name="XCFW" level="framework" contribution="contributed">
+ <component name="XCFW.dll=binary" old_model="s60" old_layer="mw" old_package="xmlui" old_collection="xcfw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\xmlui\xcfw\XCFW.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="xmluifw" id="xmluifw" long-name="XML UI Framework" level="fw" contribution="contributed" comment="One plugin uses Netscape plugin API.">
+ <component name="Xuikon" old_model="s60" old_layer="mw" old_package="xmlui" old_collection="xmluifw" comment="One plugin uses Netscape plugin API." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\xmlui\xmluifw\Xuikon" source_size="18850926.9"/>
+ </collection>
+ </block>
+ <block long-name="Application Installation" tech_domain="rt" level="1" name="appinstall" levels="framework generic specific api" contribution="contributed">
+ <collection name="ncdengine" id="ncdengine" long-name="NCD Engine" level="framework" contribution="contributed">
+ <component name="debuglogger" old_model="s60" old_layer="mw" old_package="ncdengines" old_collection="ncdengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ncdengines\ncdengine\debuglogger" source_size="36670.2"/>
+ <component name="engine" old_model="s60" old_layer="mw" old_package="ncdengines" old_collection="ncdengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="pcdadapter" old_model="s60" old_layer="mw" old_package="ncdengines" old_collection="ncdengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\ncdengines\ncdengine\pcdadapter" source_size="734204.4"/>
+ </collection>
+ <collection name="iaupdateapi_stub" id="iaupdateapi_stub" long-name="IA Update API Stub" level="specific" contribution="contributed">
+ <component name="iaupdateapi_stub.dll=binary" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="iaupdateapi_stub" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\iaupdateapi_stub\iaupdateapi_stub.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="appinstaller" id="appinstaller" long-name="App Installer" level="generic" contribution="contributed">
+ <component name="AppinstUi" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="appinstaller" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\securityservices\appinstaller\AppinstUi" source_size="0.0"/>
+ <component name="AppMngr2" old_model="s60" old_layer="mw" old_package="securityservices" old_collection="appinstaller" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="installationservices" original-name="Installation Services" long-name="Installation Services" id="Installation Services" level="generic" contribution="contributed">
+ <component name="swi" original-name="Secure Software Install" long-name="Secure Software Install" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="6801360">
+ <unit bldFile="mw/appinstall/installationservices/swi/group" mrp="mw/appinstall/installationservices/swi/group/security_swi.mrp"/>
+ </component>
+ <component name="swidevicetools" original-name="Secure Software Install Device Tools" long-name="Secure Software Install Device Tools" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="85324">
+ <unit bldFile="mw/appinstall/installationservices/swidevicetools/group" mrp="mw/appinstall/installationservices/swidevicetools/group/security_switools_device.mrp"/>
+ </component>
+ <component name="sisinstaller" original-name="SIS Installer" long-name="SIS Installer" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" introduced="7.0s" removed="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit mrp="mw/appinstall/installationservices/sisinstaller/group/security_sisinstaller.mrp" bldFile="mw/appinstall/installationservices/sisinstaller/group"/>
+ </component>
+ <component name="javamidletinstaller" original-name="Java MIDlet Installer" long-name="Java MIDlet Installer" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" removed="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit mrp="mw/appinstall/installationservices/javamidletinstaller/group/security_javamidletinstaller.mrp" bldFile="mw/appinstall/installationservices/javamidletinstaller/group"/>
+ </component>
+ <component name="softwarecomponentregistry" original-name="Software Component Registry" long-name="Software Component Registry" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" introduced="Future" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/security/usif/scr/group" mrp="os/unref/orphan/comgen/security/usif/scr/group/security_softwarecomponentregistry.mrp"/>
+ </component>
+ <component name="swifw" original-name="Software Installation Framework" long-name="Software Installation Framework" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" introduced="Future" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/security/usif/sif/group" mrp="os/unref/orphan/comgen/security/usif/sif/group/security_softwareinstallframework.mrp"/>
+ </component>
+ <component name="softwaretransactionservices" original-name="Software Transaction Services" long-name="Software Transaction Services" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" introduced="Future" contribution="contributed" in_production_device_rom="yes">
+ <unit bldFile="os/unref/orphan/comgen/security/usif/sts/group" mrp="os/unref/orphan/comgen/security/usif/sts/group/security_softwaretransactionservices.mrp"/>
+ </component>
+ <component name="referencesoftwareinstallplugin" original-name="Reference Software Install Plugin" long-name="Reference Software Install Plugin" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" plugin="Y" introduced="Future" contribution="contributed" in_production_device_rom="no">
+ <unit bldFile="os/unref/orphan/comgen/security/usif/examples/installer/group" mrp="os/unref/orphan/comgen/security/usif/examples/installer/group/security_sifrefplugin.mrp"/>
+ </component>
+ <component name="referencesoftwareappmgr" original-name="Reference Software Application Manager" long-name="Reference Software Application Manager" old_model="MCL" old_layer="Generic Middleware" old_package="Application Provisioning and Installation" old_collection="Installation Services" comment="" introduced="Future" contribution="contributed" in_production_device_rom="no">
+ <unit bldFile="os/unref/orphan/comgen/security/usif/examples/appmanager/group" mrp="os/unref/orphan/comgen/security/usif/examples/appmanager/group/security_referenceapplicationmanager.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Service API Framework" tech_domain="rt" level="2" name="serviceapifw" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="languageinterworkingfw" id="languageinterworkingfw" long-name="Language Interworking Framework" level="framework" contribution="contributed">
+ <component name="servicehandler" old_model="s60" old_layer="mw" old_package="openfw" old_collection="languageinterworkingfw" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\openfw\languageinterworkingfw\servicehandler" source_size="213977.7"/>
+ </collection>
+ <collection name="rtsecuritymanager" id="rtsecuritymanager" long-name="RT Security Manager" level="server" contribution="contributed">
+ <component name="rtsecuritymanagerclient" old_model="s60" old_layer="mw" old_package="openfw" old_collection="rtsecuritymanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\openfw\rtsecuritymanager\rtsecuritymanagerclient" source_size="30332.4"/>
+ <component name="rtsecuritymanagerserver" old_model="s60" old_layer="mw" old_package="openfw" old_collection="rtsecuritymanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\openfw\rtsecuritymanager\rtsecuritymanagerserver" source_size="46156.2"/>
+ <component name="rtsecuritymanagerutil" old_model="s60" old_layer="mw" old_package="openfw" old_collection="rtsecuritymanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="yes" not_used_by_s60="" path="\s60\mw\openfw\rtsecuritymanager\rtsecuritymanagerutil" source_size="12590.7"/>
+ </collection>
+ </block>
+ <block long-name="Service API" tech_domain="rt" level="2" name="serviceapi" levels="os mw1 mw2 app" contribution="contributed">
+ <collection name="sapi_applicationmanager" id="sapi_applicationmanager" long-name="SAPI Application Manager" level="mw1" contribution="contributed">
+ <component name="appmanagerservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_applicationmanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_applicationmanager\appmanagerservice" source_size="31594.2"/>
+ <component name="appmanagerprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_applicationmanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_applicationmanager\appmanagerprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_calendar" id="sapi_calendar" long-name="SAPI Calendar" level="app" contribution="contributed">
+ <component name="calendarservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_calendar" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_calendar\calendarservice" source_size="72542.1"/>
+ <component name="calendarprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_calendar" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_calendar\calendarprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_contacts_vpbk" id="sapi_contacts_vpbk" long-name="SAPI Contacts Vpbk" level="app" contribution="contributed">
+ <component name="contactservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_contacts_vpbk" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_contacts_vpbk\contactservice" source_size="69069.3"/>
+ <component name="contactprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_contacts_vpbk" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_contacts_vpbk\contactprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_landmarks" id="sapi_landmarks" long-name="SAPI Landmarks" level="mw2" contribution="contributed">
+ <component name="landmarksservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_landmarks" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_landmarks\landmarksservice" source_size="33679.8"/>
+ <component name="landmarkprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_landmarks" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_landmarks\landmarkprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_location" id="sapi_location" long-name="SAPI Location" level="mw2" contribution="contributed">
+ <component name="locationservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_location" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_location\locationservice" source_size="11735.7"/>
+ <component name="locationprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_location" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_location\locationprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_logging" id="sapi_logging" long-name="SAPI Logging" level="app" contribution="contributed">
+ <component name="loggingservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_logging" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_logging\loggingservice" source_size="29022.0"/>
+ <component name="loggingprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_logging" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_logging\loggingprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_mediamanagement" id="sapi_mediamanagement" long-name="SAPI Media Management" level="mw2" contribution="contributed">
+ <component name="mediamanagementservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_mediamanagement" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_mediamanagement\mediamanagementservice" source_size="17338.5"/>
+ <component name="mediamanagementprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_mediamanagement" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_mediamanagement\mediamanagementprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_messaging" id="sapi_messaging" long-name="SAPI Messaging" level="mw2" contribution="contributed">
+ <component name="messagingservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_messaging" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_messaging\messagingservice" source_size="45003.6"/>
+ <component name="messagingprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_messaging" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_messaging\messagingprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_sensor" id="sapi_sensor" long-name="SAPI Sensor" level="mw1" contribution="contributed">
+ <component name="sensorservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_sensor" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_sensor\sensorservice" source_size="9492.6"/>
+ <component name="sensorprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_sensor" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_sensor\sensorprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="sapi_sysinfo" id="sapi_sysinfo" long-name="SAPI Sysinfo" level="mw1" contribution="contributed">
+ <component name="sysinfoservice" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_sysinfo" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_sysinfo\sysinfoservice" source_size="72727.5"/>
+ <component name="sysinfoprovider.dll=binary" old_model="s60" old_layer="mw" old_package="serviceapi" old_collection="sapi_sysinfo" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\serviceapi\sapi_sysinfo\sysinfoprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Open Services" tech_domain="rt" level="2" name="opensrv" levels="empty 1" contribution="contributed" copyright_holder="OSS" license="LGPL" source="yes" license_type="OSS">
+ <collection name="loudmouth" id="loudmouth" long-name="Loudmouth" level="1" contribution="available" copyright_holder="OSS" license="LGPL" source="yes" license_type="OSS">
+ <component name="loudmouth.DLL=binary" old_model="s60" old_layer="mw" old_package="openservices" old_collection="loudmouth" comment="" contribution="available" copyright_holder="OSS" license="LGPL" source="yes" license_type="OSS"/>
+ </collection>
+ </block>
+ <block long-name="Web" tech_domain="rt" level="2" name="web" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="browserplugins" id="BrowserPlugins" long-name="Browser Plugins" level="framework" contribution="contributed">
+ <component name="BrowserAudioVideoPlugin" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserPlugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserPlugins\BrowserAudioVideoPlugin" source_size="283221.9"/>
+ <component name="BrowserGpsPlugin" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserPlugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserPlugins\BrowserGpsPlugin" source_size="15031.2"/>
+ <component name="BrowserSystemInfoPlugin" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserPlugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserPlugins\BrowserSystemInfoPlugin" source_size="29886.6"/>
+ <component name="BrowserWidgetUtilsPlugin" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserPlugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserPlugins\BrowserWidgetUtilsPlugin" source_size="14527.5"/>
+ </collection>
+ <collection name="browserutilities" id="BrowserUtilities" long-name="Browser Utilities" level="generic" contribution="contributed">
+ <component name="AiwBrowserProvider" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\AiwBrowserProvider" source_size="57811.2"/>
+ <component name="BrowserDialogsProvider" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\BrowserDialogsProvider" source_size="608351.1"/>
+ <component name="BrowserTelService" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\BrowserTelService" source_size="773392.2"/>
+ <component name="ConnectionManager" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\ConnectionManager" source_size="5426868.3"/>
+ <component name="cXmlLibrary" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\cXmlLibrary" source_size="1147901.4"/>
+ <component name="DownloadMgr" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\DownloadMgr" source_size="1205933.7"/>
+ <component name="FavouritesEngine" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\FavouritesEngine" source_size="1769761.5"/>
+ <component name="FeedsEngine" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\FeedsEngine" source_size="4988905.5"/>
+ <component name="MultipartParser" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\MultipartParser" source_size="231174.3"/>
+ <component name="PushMtm" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\PushMtm" source_size="1454783.4"/>
+ <component name="RecentUrlStore" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\RecentUrlStore" source_size="5736.0"/>
+ <component name="SchemeHandler" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\SchemeHandler" source_size="988941.3"/>
+ <component name="WebUtils" old_model="s60" old_layer="mw" old_package="web" old_collection="BrowserUtilities" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\BrowserUtilities\WebUtils" source_size="203989.8"/>
+ <component name="XMLInterface.dll=binary" old_model="s60" old_layer="mw" old_package="xmlservices" old_collection="xmlparser" comment="Exception: the xmlengine should become a component under browserutilies-collection. So path should be web/browserutilities/xmlparse." contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\xmlservices\xmlparser\XMLInterface.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="webengine" id="WebEngine" long-name="Web Engine" level="server" contribution="contributed">
+ <component name="BrowserRecognizers" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\BrowserRecognizers" source_size="7409.1"/>
+ <component name="Device" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\Device" source_size="174860.7"/>
+ <component name="MemoryPlugin" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\MemoryPlugin" source_size="1246.8"/>
+ <component name="OssWebEngine" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="available" copyright_holder="OSS" license="LGPL" license_status="all" source="yes" license_type="OSS" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\OssWebEngine" source_size="19155435.3"/>
+ <component name="PageScaler" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\PageScaler" source_size="25050.6"/>
+ <component name="WebKitUtils" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\WebKitUtils" source_size="88062.3"/>
+ <component name="WidgetBackupRestore" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\WidgetBackupRestore" source_size="130731.0"/>
+ <component name="WidgetEngine" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\WidgetEngine" source_size="94621.8"/>
+ <component name="WidgetInstaller" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed"/>
+ <component name="WidgetMemoryPlugin" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\WidgetMemoryPlugin" source_size="1251.3"/>
+ <component name="WidgetRegistry" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\WidgetRegistry" source_size="70268.4"/>
+ <component name="WmlEngine" old_model="s60" old_layer="mw" old_package="web" old_collection="WebEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\web\WebEngine\WmlEngine" source_size="3265476.9"/>
+ </collection>
+ </block>
+ <block long-name="Web Services" tech_domain="rt" level="2" name="websrv" levels="plugin framework server generic specific" contribution="contributed">
+ <collection name="idwsfplugin" id="idwsfplugin" long-name="IDWSF Plugin" level="framework" contribution="contributed">
+ <component name="SenIDWSFplugin.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="idwsfplugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\idwsfplugin\SenIDWSFplugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="idwsfsecuritymechanism" id="idwsfsecuritymechanism" long-name="IDWSF Security Mechanism" level="framework" contribution="contributed">
+ <component name="SenIdWsfSecMech.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="idwsfsecuritymechanism" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\idwsfsecuritymechanism\SenIdWsfSecMech.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsconnection" id="wsconnection" long-name="WS Connection" level="generic" contribution="contributed">
+ <component name="SenServConn.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsconnection" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsconnection\SenServConn.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsconnectionagent" id="wsconnectionagent" long-name="WS Connection Agent" level="server" contribution="contributed">
+ <component name="wsconnagent.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsconnectionagent" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsconnectionagent\wsconnagent.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wscore" id="wscore" long-name="WS Core" level="server" contribution="contributed">
+ <component name="SEN.EXE=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wscore" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wscore\SEN.EXE=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wscredentialmanager" id="wscredentialmanager" long-name="WS Credential Manager" level="generic" contribution="contributed">
+ <component name="SenCredentialManager.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wscredentialmanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wscredentialmanager\SenCredentialManager.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsdescription" id="wsdescription" long-name="WS Description" level="generic" contribution="contributed">
+ <component name="SenServDesc.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsdescription" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsdescription\SenServDesc.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsfragment" id="wsfragment" long-name="WS Fragment" level="framework" contribution="contributed">
+ <component name="SenFragment.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsfragment" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsfragment\SenFragment.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsframework" id="wsframework" long-name="WS Framework" level="framework" contribution="contributed">
+ <component name="SenFramework.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsframework" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsframework\SenFramework.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wshostletconnection" id="wshostletconnection" long-name="WS Hostlet Connection" level="specific" contribution="contributed">
+ <component name="SenHostConn.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wshostletconnection" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wshostletconnection\SenHostConn.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wshostlettransportplugin" id="wshostlettransportplugin" long-name="WS Hostlet Transport Plugin" level="plugin" contribution="contributed">
+ <component name="SenHostletTransportPlugin.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wshostlettransportplugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wshostlettransportplugin\SenHostletTransportPlugin.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wshttpchanneltransportplugin" id="wshttpchanneltransportplugin" long-name="WS HTTP Channel Transport Plugin" level="plugin" contribution="contributed">
+ <component name="SenHttpChannelTransport.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wshttpchanneltransportplugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wshttpchanneltransportplugin\SenHttpChannelTransport.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsibasicplugin" id="wsibasicplugin" long-name="WSI Basic Plugin" level="plugin" contribution="contributed">
+ <component name="SenWsiBasicPlugin.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsibasicplugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsibasicplugin\SenWsiBasicPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsidentitymanager" id="wsidentitymanager" long-name="WS Identity Manager" level="generic" contribution="contributed">
+ <component name="SenIdentityManager.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsidentitymanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsidentitymanager\SenIdentityManager.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wslocaltransportplugin" id="wslocaltransportplugin" long-name="WS Local Transport Plugin" level="plugin" contribution="contributed">
+ <component name="SenLocalTransportPlugin.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wslocaltransportplugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wslocaltransportplugin\SenLocalTransportPlugin.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wslogger" id="wslogger" long-name="WS Logger" level="specific" contribution="contributed">
+ <component name="SenLogger.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wslogger" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wslogger\SenLogger.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsmanager" id="wsmanager" long-name="WS Manager" level="server" contribution="contributed">
+ <component name="SenServMgr.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsmanager" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsmanager\SenServMgr.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsmessages" id="wsmessages" long-name="WS Messages" level="generic" contribution="contributed">
+ <component name="SenMessages.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsmessages" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsmessages\SenMessages.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsnotifierplugins" id="wsnotifierplugins" long-name="WS Notifier Plugins" level="framework" contribution="contributed">
+ <component name="sennotdlg.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsnotifierplugins" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsnotifierplugins\sennotdlg.dll=binary" source_size="0.0"/>
+ <component name="sennotifierplugin.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsnotifierplugins" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsnotifierplugins\sennotifierplugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wspasswordtransforms" id="wspasswordtransforms" long-name="WS Password Transforms" level="generic" contribution="contributed">
+ <component name="SenPasswordTransforms.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wspasswordtransforms" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wspasswordtransforms\SenPasswordTransforms.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsprovider" id="wsprovider" long-name="WS Provider" level="generic" contribution="contributed">
+ <component name="SenProvider.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsprovider" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsprovider\SenProvider.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsrestplugin" id="wsrestplugin" long-name="WS REST Plugin" level="plugin" contribution="contributed">
+ <component name="SenRestPlugin.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsrestplugin" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsrestplugin\SenRestPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsstar" id="wsstar" long-name="WS Star" level="specific" contribution="contributed">
+ <component name="wsstarmessagehandlers" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsstar" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsstar\wsstarmessagehandlers" source_size="201709.8"/>
+ <component name="wsstarplugin" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsstar" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsstar\wsstarplugin" source_size="386195.1"/>
+ <component name="wsstarpolicy" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsstar" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsstar\wsstarpolicy" source_size="132303.9"/>
+ </collection>
+ <collection name="wsutils" id="wsutils" long-name="WS Utils" level="specific" contribution="contributed">
+ <component name="SenUtils.DLL=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsutils" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsutils\SenUtils.DLL=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wsxml" id="wsxml" long-name="WS XML" level="specific" contribution="contributed">
+ <component name="SenXml.dll=binary" old_model="s60" old_layer="mw" old_package="webservices" old_collection="wsxml" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\webservices\wsxml\SenXml.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="UI Tools" tech_domain="to" level="2" name="uitools" levels="unused 1 2" contribution="contributed" in_production_device_rom="no">
+ <collection name="svgtencoder" level="1" contribution="contributed" in_production_device_rom="no">
+ <component name="SVGTEncoder" long-name="SVGT Encoder" id="SVGTEncoder" old_model="s60" old_layer="mw" old_package="graphics" old_collection="SVGTopt" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="yes" not_used_by_s60="" path="\s60\mw\graphics\SVGTopt\SVGTEncoder" source_size="5199154.5"/>
+ </collection>
+ <collection name="Layout Tools" level="2" in_production_device_rom="no">
+ <component name="AknLayoutCompiler compo" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" mcl_component="aknlayoutcompiler" contribution="contributed" old_model="S60Tools" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\AknLayoutCompiler\AknLayoutCompiler compo" source_size="0.0"/>
+ <component name="cdlcompiler compo" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" mcl_component="cdlcompiler" contribution="contributed" old_model="S60Tools" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\cdlcompiler\cdlcompiler compo" source_size="0.0"/>
+ <component name="cdlcompilertoolkit compo" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" mcl_component="cdlcompilertoolkit" contribution="contributed" old_model="S60Tools" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\cdlcompilertoolkit\cdlcompilertoolkit compo" source_size="0.0"/>
+ <component name="AknSkinDescCompiler" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" mcl_component="skincompiler" contribution="contributed" old_model="S60Tools" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\skincompiler\AknSkinDescCompiler" source_size="295.2"/>
+ <component name="LCT" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" in_production_device_rom="no"/>
+ </collection>
+ <collection name="Carbide.ui" level="2" in_production_device_rom="no">
+ <component name="Color" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\gfxtools\Color" source_size="19293.0"/>
+ <component name="gditools" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\gfxtools\gditools" source_size="51338.4"/>
+ <component name="reszip.exe=binary" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\reszip\reszip.exe=binary" source_size="0.0"/>
+ <component name="Arabica" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="OSS" license_status="open" desktop="yes" license_type="OSS" foundation="yes" license="Arabica" contribution="available" old_model="S60Tools" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\toollibraries\Arabica" source_size="253832.1"/>
+ <component name="Carbide.ui" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" in_production_device_rom="no"/>
+ <component name="XercesC" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="OSS" license_status="open" license_type="OSS" desktop="yes" foundation="yes" license="Apache License v2" contribution="available" old_model="S60Tools" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\uitools\toollibraries\XercesC" source_size="4678473.3"/>
+ </collection>
+ <collection name="UXD tools" level="1" in_production_device_rom="no">
+ <component name="UXD tools" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="UI Tools" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" in_production_device_rom="no"/>
+ </collection>
+ </block>
+ </layer>
+ <layer name="s60mw" long-name="S60 Middleware" span="1" levels="1 2" contribution="excluded">
+ <block long-name="Web Services Device Enablers" tech_domain="rt" level="2" name="websrvde" levels="unused 1 2" contribution="excluded" copyright_holder="Nokia" comment="Ovi account manager">
+ <collection name="ncim" id="ncim" long-name="NCIM" level="2" contribution="excluded" copyright_holder="Nokia" comment="Ovi account manager">
+ <component name="ncimaccountmanager" old_model="s60" old_layer="mw" old_package="webservices" old_collection="ncim" comment="Ovi account manager" contribution="excluded" copyright_holder="Nokia"/>
+ <component name="ncimoviplugin" old_model="s60" old_layer="mw" old_package="webservices" old_collection="ncim" comment="Ovi account manager" contribution="excluded" copyright_holder="Nokia"/>
+ <component name="wsoviplugin" old_model="s60" old_layer="mw" old_package="webservices" old_collection="ncim" comment="Ovi account manager" contribution="excluded" copyright_holder="Nokia"/>
+ </collection>
+ </block>
+ </layer>
+ <layer name="app" long-name="Applications" levels="services apps" contribution="contributed">
+ <block long-name="Location Apps" tech_domain="lo" level="apps" name="location" levels="engine ui apps" contribution="contributed">
+ <collection name="landmarksui" id="LandmarksUi" long-name="Landmarks UI" level="ui" contribution="contributed">
+ <component name="app" old_model="s60" old_layer="app" old_package="location" old_collection="LandmarksUi" comment="" contribution="contributed"/>
+ <component name="commonui" old_model="s60" old_layer="app" old_package="location" old_collection="LandmarksUi" comment="" contribution="contributed"/>
+ <component name="engine" old_model="s60" old_layer="app" old_package="location" old_collection="LandmarksUi" comment="" contribution="contributed"/>
+ <component name="msgviewer" old_model="s60" old_layer="app" old_package="location" old_collection="LandmarksUi" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\location\LandmarksUi\msgviewer" source_size="15638.4"/>
+ <component name="uicontrols" old_model="s60" old_layer="app" old_package="location" old_collection="LandmarksUi" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\location\LandmarksUi\uicontrols" source_size="334737.3"/>
+ </collection>
+ <collection name="basiclocationinfodisplay" id="basiclocationinfodisplay" long-name="Basic Location Info Display" level="ui" contribution="contributed">
+ <component name="blid" old_model="s60" old_layer="app" old_package="location" old_collection="basiclocationinfodisplay" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\location\basiclocationinfodisplay\blid" source_size="2365422.6"/>
+ </collection>
+ <collection name="eventsui" id="eventsui" long-name="Events UI" contribution="contributed">
+ <component name="eventseditor" old_model="s60" old_layer="app" old_package="location" old_collection="eventsui" comment="" contribution="contributed"/>
+ <component name="eventsengine" old_model="s60" old_layer="app" old_package="location" old_collection="eventsui" comment="" contribution="contributed"/>
+ <component name="eventshandlerui" old_model="s60" old_layer="app" old_package="location" old_collection="eventsui" comment="" contribution="contributed"/>
+ <component name="eventsmgmtui" old_model="s60" old_layer="app" old_package="location" old_collection="eventsui" comment="" contribution="contributed"/>
+ <component name="eventsutils" old_model="s60" old_layer="app" old_package="location" old_collection="eventsui" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="locationlandmarksrefappfors60" id="LocationLandmarksRefAppForS60" long-name="Location Landmarks Reference App for S60" level="apps" contribution="contributed">
+ <component name="lmrefapp.exe=binary" old_model="s60" old_layer="refapp" old_package="locationrefapp" old_collection="LocationLandmarksRefAppForS60" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="locationlandmarksuirefapp" id="LocationLandmarksUIRefApp" long-name="Location Landmarks UI Reference App" level="apps" contribution="contributed">
+ <component name="LmUiRefApp.exe=binary" old_model="s60" old_layer="refapp" old_package="locationrefapp" old_collection="LocationLandmarksUIRefApp" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="locationnokiaprivacyadaptationrefimpl" id="LocationNokiaPrivacyAdaptationRefImpl" long-name="Location Nokia Privacy Adaptation Reference Implementaion" level="engine" contribution="contributed">
+ <component name="privlistref.exe=binary" old_model="s60" old_layer="refapp" old_package="locationrefapp" old_collection="LocationNokiaPrivacyAdaptationRefImpl" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="locationrefappfors60" id="LocationRefAppForS60" long-name="Location Reference App for S60" level="apps" contribution="contributed">
+ <component name="LBSReference.exe=binary" old_model="s60" old_layer="refapp" old_package="locationrefapp" old_collection="LocationRefAppForS60" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="yes"/>
+ </collection>
+ <collection name="locationsatviewrefapp" id="LocationSatViewRefApp" long-name="Location Sat View Reference App" level="apps" contribution="contributed">
+ <component name="SatelliteReference.exe=binary" old_model="s60" old_layer="refapp" old_package="locationrefapp" old_collection="LocationSatViewRefApp" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="locationsimulationpsy10" id="LocationSimulationPSY10" long-name="Location Simulation PSY10" level="engine" contribution="contributed">
+ <component name="epossimulationpsy.dll=binary" old_model="s60" old_layer="tools" old_package="locationtools" old_collection="LocationSimulationPSY10" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\locationtools\LocationSimulationPSY10\epossimulationpsy.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="simpsyconfigurator" id="SimPsyConfigurator" long-name="SIM PSY Configurator" level="engine" contribution="contributed">
+ <component name="simpsyui.exe=binary" old_model="s60" old_layer="tools" old_package="locationtools" old_collection="SimPsyConfigurator" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\locationtools\SimPsyConfigurator\simpsyui.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="mapnavproviderrefapp" id="mapnavproviderrefapp" long-name="Map Nav Provider Reference App" level="apps" contribution="contributed">
+ <component name="mnrefproviderengine.dll=binary" old_model="s60" old_layer="tools" old_package="locationtools" old_collection="mapnavproviderrefapp" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\locationtools\mapnavproviderrefapp\mnrefproviderengine.dll=binary" source_size="0.0"/>
+ <component name="mnrefprovider.exe=binary" old_model="s60" old_layer="tools" old_package="locationtools" old_collection="mapnavproviderrefapp" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\locationtools\mapnavproviderrefapp\mnrefprovider.exe=binary" source_size="0.0"/>
+ <component name="mnrefproviderback.exe=binary" old_model="s60" old_layer="tools" old_package="locationtools" old_collection="mapnavproviderrefapp" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\locationtools\mapnavproviderrefapp\mnrefproviderback.exe=binary" source_size="0.0"/>
+ <component name="MnRefProviderPlugin.dll=binary" old_model="s60" old_layer="tools" old_package="locationtools" old_collection="mapnavproviderrefapp" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\locationtools\mapnavproviderrefapp\MnRefProviderPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Multimedia Sharing UIs" tech_domain="vc" level="services" name="mmsharinguis" levels="empty 1" contribution="contributed">
+ <collection name="mmsharing" id="mmsharing" long-name="MM Sharing" level="1" contribution="contributed">
+ <component name="src" old_model="s60" old_layer="app" old_package="multimediasharing" old_collection="mmsharing" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ </block>
+ <block long-name="Phone Apps" tech_domain="vc" level="apps" span="2" name="phone" levels="engine ui apps" contribution="contributed">
+ <collection name="phoneapp" id="phoneapp" long-name="Phone App" level="apps" contribution="contributed">
+ <component name="Blacklist" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\Blacklist" source_size="247234.8"/>
+ <component name="phoneui" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\phoneui" source_size="11355201.0"/>
+ <component name="phoneuicontrol" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\phoneuicontrol" source_size="341358.6"/>
+ <component name="phoneuistates" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\phoneuistates" source_size="151691.4"/>
+ <component name="phoneuiutils" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\phoneuiutils" source_size="364395.0"/>
+ <component name="phoneuiview" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\phoneuiview" source_size="285345.6"/>
+ <component name="phoneuivoipextension" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\phoneuivoipextension" source_size="34766.4"/>
+ <component name="silenceactionplugin" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneapp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneapp\silenceactionplugin" source_size="160965.0"/>
+ </collection>
+ <collection name="phoneengine" id="phoneengine" long-name="Phone Engine" level="engine" contribution="contributed">
+ <component name="audiohandling" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneengine\audiohandling" source_size="277296.9"/>
+ <component name="callhandling" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneengine\callhandling" source_size="1367452.5"/>
+ <component name="contacthandling" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneengine\contacthandling" source_size="125442.6"/>
+ <component name="loghandling" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneengine\loghandling" source_size="303089.4"/>
+ <component name="PhoneCntFinder" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneengine\PhoneCntFinder" source_size="1199622.3"/>
+ <component name="phonemodel" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneengine\phonemodel" source_size="5915783.1"/>
+ <component name="servicehandling" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneengine" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="phonesettings" id="phonesettings" long-name="Phone Settings" level="ui" contribution="contributed">
+ <component name="aiwcallimageplugin" old_model="s60" old_layer="app" old_package="telephony" old_collection="phonesettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phonesettings\aiwcallimageplugin" source_size="270154.2"/>
+ <component name="PsetNotesUi" old_model="s60" old_layer="app" old_package="telephony" old_collection="phonesettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phonesettings\PsetNotesUi" source_size="348739.2"/>
+ <component name="pslncallimageplugin" old_model="s60" old_layer="app" old_package="telephony" old_collection="phonesettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phonesettings\pslncallimageplugin" source_size="601779.9"/>
+ <component name="SSSettings" old_model="s60" old_layer="app" old_package="telephony" old_collection="phonesettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phonesettings\SSSettings" source_size="655761.6"/>
+ <component name="telephonysettings" old_model="s60" old_layer="app" old_package="telephony" old_collection="phonesettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phonesettings\telephonysettings" source_size="973071.6"/>
+ </collection>
+ <collection name="phoneuis" id="phoneuis" long-name="Phone UIs" level="ui" contribution="contributed">
+ <component name="BubbleManager" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\BubbleManager" source_size="2043113.1"/>
+ <component name="ConnectUtil" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\ConnectUtil" source_size="467977.5"/>
+ <component name="dialer" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\dialer" source_size="703903.8"/>
+ <component name="ServiceRequest" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\ServiceRequest" source_size="299686.5"/>
+ <component name="SFIUtils" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\SFIUtils" source_size="499217.7"/>
+ <component name="TelephonyDeviceMode" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\TelephonyDeviceMode" source_size="188009.1"/>
+ <component name="Ussd" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\Ussd" source_size="433414.5"/>
+ <component name="vmbx" old_model="s60" old_layer="app" old_package="telephony" old_collection="phoneuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\telephony\phoneuis\vmbx" source_size="944044.8"/>
+ </collection>
+ </block>
+ <block long-name="Video Telephony Apps" tech_domain="vc" level="apps" name="videotelephony" levels="engine ui" contribution="contributed">
+ <collection name="packetvideoengine" id="packetvideoengine" long-name="Packetvideo Engine" level="engine" contribution="excluded" license_type="commercial" copyright_holder="Packet Video Inc." license="S60 OEM R&D" license_status="no" source="no" ship_license_required="mandatory">
+ <component name="PacketVideoEngineBinaries" old_model="s60" old_layer="app" old_package="videotelephony" old_collection="packetvideoengine" comment="" contribution="excluded" license_type="commercial" copyright_holder="Packet Video Inc." license="S60 OEM R&D" license_status="no" source="no" ship_license_required="mandatory" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries" source_size="109105159.8"/>
+ </collection>
+ <collection name="packetvideoplugins" id="packetvideoplugins" long-name="Packetvideo Plugins" level="engine" contribution="contributed">
+ <component name="DisplaySink" old_model="s60" old_layer="app" old_package="videotelephony" old_collection="packetvideoplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\videotelephony\packetvideoplugins\DisplaySink" source_size="6157268.7"/>
+ <component name="VideoSource" old_model="s60" old_layer="app" old_package="videotelephony" old_collection="packetvideoplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\videotelephony\packetvideoplugins\VideoSource" source_size="2927297.7"/>
+ </collection>
+ <collection name="vtengines" id="vtengines" long-name="Video Telephony Engines" level="engine" contribution="contributed">
+ <component name="videotelcomms" old_model="s60" old_layer="app" old_package="videotelephony" old_collection="vtengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\videotelephony\vtengines\videotelcomms" source_size="391187.4"/>
+ <component name="videoteleng" old_model="s60" old_layer="app" old_package="videotelephony" old_collection="vtengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\videotelephony\vtengines\videoteleng" source_size="1645995.6"/>
+ </collection>
+ <collection name="vtuis" id="vtuis" long-name="Video Telephony UIs" level="ui" contribution="contributed">
+ <component name="videotelui" old_model="s60" old_layer="app" old_package="videotelephony" old_collection="vtuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\videotelephony\vtuis\videotelui" source_size="2014200.9"/>
+ </collection>
+ </block>
+ <block long-name="PoC" tech_domain="vc" level="apps" name="poc" levels="unused engine ui" contribution="contributed">
+ <collection name="pocengine" id="PoCEngine" long-name="PoC Engine" level="engine" contribution="contributed">
+ <component name="sipclientresolver" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\sipclientresolver" source_size="5069.1"/>
+ <component name="PoCOmaCommon.DLL=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaCommon.DLL=binary" source_size="0.0"/>
+ <component name="PoCOmaPresenceHandlerResolver.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaPresenceHandlerResolver.dll=binary" source_size="0.0"/>
+ <component name="PoCOmaPresenceHandler.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaPresenceHandler.dll=binary" source_size="0.0"/>
+ <component name="PoCOmaServer.exe=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaServer.exe=binary" source_size="0.0"/>
+ <component name="PoCOmaEngine.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaEngine.dll=binary" source_size="0.0"/>
+ <component name="PoCOmaSIPClientResolver.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaSIPClientResolver.dll=binary" source_size="0.0"/>
+ <component name="PoCOmaSettingsAdapter.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaSettingsAdapter.dll=binary" source_size="0.0"/>
+ <component name="PoCOmaDeviceManagementAdapter.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCOmaDeviceManagementAdapter.dll=binary" source_size="0.0"/>
+ <component name="PoCEngineResolver.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCEngineResolver.dll=binary" source_size="0.0"/>
+ <component name="PoCEngineImplementation.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCEngine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCEngine\PoCEngineImplementation.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="pocui" id="PoCUi" long-name="PoC Ui" level="ui" contribution="contributed">
+ <component name="app" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed"/>
+ <component name="PoCUiIntgr" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCUi\PoCUiIntgr" source_size="618256.2"/>
+ <component name="PoCIntegrationPlugin.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCUi\PoCIntegrationPlugin.dll=binary" source_size="0.0"/>
+ <component name="PoCBioPlugin.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCUi\PoCBioPlugin.dll=binary" source_size="0.0"/>
+ <component name="PoCUiIndicatorPlugin.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCUi\PoCUiIndicatorPlugin.dll=binary" source_size="0.0"/>
+ <component name="PoCGSPlugin.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCUi\PoCGSPlugin.dll=binary" source_size="0.0"/>
+ <component name="PoCSourcePlugin.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCUi\PoCSourcePlugin.dll=binary" source_size="0.0"/>
+ <component name="PoCActionPlugin.dll=binary" old_model="s60" old_layer="app" old_package="PoC" old_collection="PoCUi" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\PoC\PoCUi\PoCActionPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="IP Telephony" tech_domain="vc" level="apps" name="iptelephony" contribution="contributed">
+ <collection name="commsconfig" id="commsconfig" long-name="Comms Config" contribution="contributed">
+ <component name="cscapplicationui" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="commsconfig" comment="" contribution="contributed"/>
+ <component name="cscengine" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="commsconfig" comment="" contribution="contributed"/>
+ <component name="cscsettingsui" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="commsconfig" comment="" contribution="contributed"/>
+ <component name="cscsipvoipcleanupplugin" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="commsconfig" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="convergedconnectionhandler" id="convergedconnectionhandler" long-name="Converged Connection Handler" contribution="contributed">
+ <component name="cchclient" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="convergedconnectionhandler" comment="" contribution="contributed"/>
+ <component name="cchclientapi" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="convergedconnectionhandler" comment="" contribution="contributed"/>
+ <component name="cchserver" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="convergedconnectionhandler" comment="" contribution="contributed"/>
+ <component name="cchui" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="convergedconnectionhandler" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="richcallsettingsengine" id="richcallsettingsengine" long-name="Rich Call Settings Engine" contribution="contributed">
+ <component name="rcse2" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="richcallsettingsengine" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="sipvoipprovider" id="sipvoipprovider" long-name="SIP VoIP Provider" contribution="contributed">
+ <component name="svp.dll=binary" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="sipvoipprovider" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="voipplugins" id="voipplugins" long-name="VoIP Plugins" contribution="contributed">
+ <component name="accountcreationplugin" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="voipplugins" comment="" contribution="contributed"/>
+ <component name="dhcppositionprovider" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="voipplugins" comment="" contribution="contributed"/>
+ <component name="ipapputils" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="voipplugins" comment="" contribution="contributed"/>
+ <component name="sipconnectionprovider" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="voipplugins" comment="" contribution="contributed"/>
+ <component name="sipmxresolver" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="voipplugins" comment="" contribution="contributed"/>
+ <component name="voipadapters" old_model="s60" old_layer="app" old_package="iptelephony" old_collection="voipplugins" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="Settings UIs" tech_domain="dm" level="services" name="settingsuis" levels="empty rsc ui" contribution="contributed">
+ <collection name="defaultapplicationsettings" id="DefaultApplicationSettings" long-name="Default Application Settings" level="rsc" contribution="contributed">
+ <component name="gsplugin" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="DefaultApplicationSettings" comment="" contribution="contributed"/>
+ <component name="server" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="DefaultApplicationSettings" comment="" contribution="contributed"/>
+ <component name="service" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="DefaultApplicationSettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\DefaultApplicationSettings\service" source_size="4952.7"/>
+ <component name="services_db" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="DefaultApplicationSettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\DefaultApplicationSettings\services_db" source_size="3764.1"/>
+ </collection>
+ <collection name="systemswuis" id="systemswuis" long-name="System SW UIs" level="ui" contribution="contributed">
+ <component name="touchscreencalib" old_model="s60" old_layer="mw" old_package="devicemanagement" old_collection="systemswuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\devicemanagement\systemswuis\touchscreencalib" source_size="369609.0"/>
+ </collection>
+ </block>
+ <block long-name="Content Control Daemons" tech_domain="dm" level="services" name="contentcontrol" levels="1 2" contribution="contributed">
+ <collection name="applicationmanagement" id="applicationmanagement" long-name="Application Management" level="1" contribution="contributed">
+ <component name="tarmappmng" old_model="s60" old_layer="app" old_package="contentcontrol" old_collection="applicationmanagement" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\contentcontrol\applicationmanagement\tarmappmng" source_size="591470.4"/>
+ </collection>
+ <collection name="customization" id="customization" long-name="Customization" level="2" contribution="contributed">
+ <component name="tarmcustomization" old_model="s60" old_layer="app" old_package="contentcontrol" old_collection="customization" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\contentcontrol\customization\tarmcustomization" source_size="622748.1"/>
+ </collection>
+ <collection name="omads" id="omads" long-name="OMA DS" level="1" contribution="contributed">
+ <component name="OmaDsAppUi" old_model="s60" old_layer="app" old_package="contentcontrol" old_collection="omads" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\contentcontrol\omads\OmaDsAppUi" source_size="1483939.5"/>
+ <component name="omadsextensions" old_model="s60" old_layer="app" old_package="contentcontrol" old_collection="omads" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\contentcontrol\omads\omadsextensions" source_size="2340402.0"/>
+ <component name="SyncMLNotifier" old_model="s60" old_layer="app" old_package="contentcontrol" old_collection="omads" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\contentcontrol\omads\SyncMLNotifier" source_size="925435.8"/>
+ <component name="SyncService" old_model="s60" old_layer="app" old_package="contentcontrol" old_collection="omads" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\contentcontrol\omads\SyncService" source_size="52197.0"/>
+ </collection>
+ </block>
+ <block long-name="Device Control Daemons" tech_domain="dm" level="services" name="devicecontrol" levels="1 2" contribution="contributed">
+ <collection name="devicediagnostics" id="devicediagnostics" long-name="Device Diagnostics" level="2" contribution="contributed">
+ <component name="devdiagapp" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="devicediagnostics" comment="" contribution="contributed"/>
+ <component name="devdiaggsplugin" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="devicediagnostics" comment="" contribution="contributed"/>
+ <component name="diagplugins" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="devicediagnostics" comment="" contribution="contributed"/>
+ <component name="diagsuites" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="devicediagnostics" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="fotaapplication" id="fotaapplication" long-name="FOTA Application" level="2" contribution="contributed">
+ <component name="FotaServer" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="fotaapplication" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\devicecontrol\fotaapplication\FotaServer" source_size="726713.1"/>
+ </collection>
+ <collection name="omadm" id="omadm" long-name="OMA DM" level="1" contribution="contributed">
+ <component name="OmaDmAppUi" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="omadm" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\devicecontrol\omadm\OmaDmAppUi" source_size="2322990.9"/>
+ <component name="omadmextensions" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="omadm" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\devicecontrol\omadm\omadmextensions" source_size="5789719.2"/>
+ </collection>
+ <collection name="pnpmobileservices" id="pnpmobileservices" long-name="PnP Mobile Services" level="1" contribution="contributed">
+ <component name="PnPMS" old_model="s60" old_layer="app" old_package="devicecontrol" old_collection="pnpmobileservices" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\devicecontrol\pnpmobileservices\PnPMS" source_size="1403819.7"/>
+ </collection>
+ </block>
+ <block name="pcsuite" long-name="PC Suite" levels="pcsuite-lib pcsuite-control pcsuite-mm pcsuite" tech_domain="de" level="apps" contribution="contributed">
+ <collection name="ApplicationInstaller" long-name="Application Installer" level="pcsuite-control">
+ <component name="ApplicationInstallerApp" long-name="Application Installer" comment="Phone application installer" Application="Application Installer 2.1" Modules="NAI2-UI" old_model="PCSuite"/>
+ </collection>
+ <collection name="ConnectionManager" long-name="Connection Manager" level="pcsuite-control">
+ <component name="ConneMgr" long-name="Connection Manager" comment="manage active connectivity bearers" Application="Connection Manager 2" Modules="Application, Cpl" old_model="PCSuite"/>
+ </collection>
+ <collection name="ContentCopier" long-name="Content Copier" level="pcsuite-control">
+ <component name="ContentCopierApp" long-name="Content Copier" comment="backup from phone to PC, transfer data between phones" Application="Content Copier 4" Modules="NCC4" old_model="PCSuite"/>
+ </collection>
+ <collection name="GetConnectedWizard" long-name="Get Connected Wizard" level="pcsuite-control">
+ <component name="GetConnectedWizard" long-name="Get Connected Wizard" comment="add new phone" Application="Getting Connected Wizard" Modules="GCWizard" old_model="PCSuite"/>
+ </collection>
+ <collection name="Helps" level="pcsuite">
+ <component name="AppHelps" comment="help files for applications" Application="Helps" Modules="Helps_Series60" old_model="PCSuite"/>
+ </collection>
+ <collection name="ImageStore" long-name="Image Store" level="pcsuite-mm">
+ <component name="ImageStoreApp" long-name="Image Store" comment="store images and videos from the phone to pc" Application="ImageStore" Modules="ImageStore" old_model="PCSuite"/>
+ </collection>
+ <collection name="Installer" level="pcsuite-lib">
+ <component name="InstallerEng" long-name="Installer Engine" comment="installer engine" Application="Installer" Modules="Core" old_model="PCSuite"/>
+ <component name="InstallerApp" long-name="Installer App" comment="installer application" Application="Installer" Modules="UI" old_model="PCSuite"/>
+ <component name="PackerLibrary" long-name="Packer Library" comment="wrapper for compression library" Application="Installer" Modules="PackerLibrary" old_model="PCSuite"/>
+ </collection>
+ <collection name="3rdparty" long-name="3rd Party" level="pcsuite-lib">
+ <component name="libpng" comment="handles png files" Application="Installer" Modules="PngLib" license="zlib/libpng License" source="yes" ship_license_required="no" copyright_holder="Glenn Randers-Pehrson" license_type="OSS" contribution="available" old_model="PCSuite"/>
+ <component name="7zip" comment="7zip compression library" Application="Installer" Modules="7Zip" license="LGPL" source="yes" ship_license_required="no" copyright_holder="?" license_type="OSS" contribution="available" old_model="PCSuite"/>
+ <component name="libjpeg" comment="library for handling jpeg" Application="PCSCM" Modules="PCSCM" license="IJG libjpeg licence" source="yes" ship_license_required="no" copyright_holder="Tom Lane, Philip Gladstone, Jim Boucher, Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG Group" license_type="OSS" contribution="available" old_model="PCSuite"/>
+ <component name="zlib" comment="zlib compression package" license="zlib/libpng License" source="yes" ship_license_required="no" copyright_holder="Jean-loup Gailly and Mark Adler" license_type="OSS" contribution="available" old_model="PCSuite"/>
+ </collection>
+ <collection name="LaunchApplication" long-name="Launch Application" level="pcsuite">
+ <component name="LaunchApplicationApp" long-name="Launch Application" comment="application laucher" Application="Launch Application NG" Modules="LaunchApplicationNG" old_model="PCSuite"/>
+ </collection>
+ <collection name="MultimediaPlayer" long-name="Multimedia Player" level="pcsuite-mm">
+ <component name="MultimediaPlayerApp" long-name="Multimedia Player" comment="view multimedia files, MMS, and convert video/audio to mobile formats" Application="Multimedia Player" Modules="CoolPlayer" old_model="PCSuite"/>
+ </collection>
+ <collection name="ImageConverter" long-name="Image Converter" level="pcsuite-mm">
+ <component name="ImageConverterApp" long-name="Image Converter" comment="Image Converter is an end-user tool for converting and modifying picture files." Application="NIC" Modules="ImageConverter" old_model="PCSuite"/>
+ <component name="ImageConverterCOC" long-name="Image Converter COC" comment="Graphics library classes have been encapsulated to separate graphics library, ImageConverter_GL.dll. This library includes almost all image processing code, like effects, image stretching and resizing, and enhancements." Application="NIC" Modules="ImageConverter_COC" old_model="PCSuite"/>
+ <component name="ImageConverterGL" long-name="Image Converter GL" comment="For implementing phone model dependent cut out covers printing, the cut out covers mask bitmaps are stored in separate resource-only DLL. One cut out cover mask DLL may contain mask bitmaps for one or more phones." Application="NIC" Modules="ImageConverter_GL" old_model="PCSuite"/>
+ </collection>
+ <collection name="MusicManager" long-name="Music Manager" level="pcsuite-mm">
+ <component name="MusicManagerApp" long-name="Music Manager" comment="rip CDs, create music files and transfer music to your phone" Application="Nokia Music Manager" Modules="NokiaMusicManager" old_model="PCSuite"/>
+ </collection>
+ <collection name="OneTouchAccess" long-name="One Touch Access" level="pcsuite-lib">
+ <component name="OneTouchAccessApp" long-name="One Touch Access" comment="One Touch Access application provides a user friendly way to establish a dial-up network connection to Internet using GPRS" Application="One Touch Access" Modules="QuickGPRS" old_model="PCSuite"/>
+ </collection>
+ <collection name="PCSync" long-name="PC Sync" level="pcsuite-control">
+ <component name="PCSyncNgr" long-name="PC Sync Ngr" comment="PC Sync supports Symbian mobile phones using the OMA DS protocol. Branding elements." Application="PC Sync 2" Modules="S60_PCS2_ngr" contribution="excluded" old_model="PCSuite"/>
+ <component name="PCSyncApp" comment="PC Sync supports Symbian mobile phones using the OMA DS protocol." contribution="excluded" source="no" copyright_holder="TimeIS" ship_license_required="yes" License="Other/prorietary" license_type="commercial" old_model="PCSuite"/>
+ </collection>
+ <collection name="PhoneBrowser" long-name="Phone Browser" level="pcsuite">
+ <component name="ContactsEditor" long-name="Contacts Editor" comment="With Contacts Editor user can view and edit contacts data." Application="Phone Browser 2" Modules="ContactsEditor" old_model="PCSuite"/>
+ <component name="vCard" comment="vCard Parser" Application="Phone Browser 2" Modules="NokiaVCard" old_model="PCSuite"/>
+ <component name="PhoneBrowserExt" long-name="Phone Browser Ext" comment="Phone Browser is a Shell Namespace Extension that is used to show the content of the phone to user." Application="Phone Browser 3" Modules="PhoneBrowser" old_model="PCSuite"/>
+ <component name="TextMessageEditor" long-name="Text Message Editor" comment="Purpose of Text Message Editor is to handle SMS, create new messages for sending, open, read and reply to existing messages." Application="Text Message Editor" Modules="TextMessageFactory" old_model="PCSuite"/>
+ </collection>
+ <collection name="Common" level="pcsuite-lib">
+ <component name="PCSCM" comment="The PC Suite Common Module library introduces several classes, which can be used in PC Suite applications" Application="PCSCM" Modules="PCSCM" old_model="PCSuite"/>
+ <component name="PCSL" comment="A dll that provides PC Suite Licensee information" old_model="PCSuite"/>
+ <component name="ConfigurationServer" long-name="Configuration Server" comment="Configuration Server provides access to phone and application configuration information for PC Suite applications in an (licensee dependant) XML data file." old_model="PCSuite"/>
+ <component name="MMCL" old_model="PCSuite"/>
+ <component name="MCL" old_model="PCSuite"/>
+ <component name="codecs" old_model="PCSuite"/>
+ </collection>
+ <collection name="tools" long-name="Tools" level="pcsuite-lib">
+ <component name="GUIDChangingTool" long-name="GUID Changing Tool" comment="build tool" old_model="PCSuite"/>
+ <component name="WIXGenerateGUIDs" long-name="WIX Generate GUIDs" comment="build tool" old_model="PCSuite"/>
+ <component name="SearchAndReplace" long-name="Search and Replace" comment="build tool" old_model="PCSuite"/>
+ <component name="BrandingTools" long-name="Branding Tools" comment="branding tool" old_model="PCSuite"/>
+ <component name="CommonSelectDevice_Tester" long-name="Common Select Device Tester" comment="test tool" old_model="PCSuite"/>
+ <component name="PCSLInfo" long-name="PCSL Info" comment="test tool" old_model="PCSuite"/>
+ <component name="ColorMapper" long-name="Color Mapper" comment="build tool" old_model="PCSuite"/>
+ <component name="FileTransferUtility" long-name="File Transfer Utility" comment="build tool" old_model="PCSuite"/>
+ <component name="LocalizedTextViewer" long-name="Localized Text Viewer" comment="build tool" old_model="PCSuite"/>
+ </collection>
+ <collection name="installation" long-name="Installation" level="pcsuite-lib">
+ <component name="pcsuite" long-name="PC Suite Install" comment="Installation project for PCSuite" Application="S60 PCSuite MSI Installation Project" Modules="PCSuite" old_model="PCSuite"/>
+ <component name="InstTools" long-name="Installation Tools" comment="Installation tools" source="no" old_model="PCSuite"/>
+ </collection>
+ </block>
+ <block name="pccs" long-name="PCCS" levels="lib plat pccs" tech_domain="de" level="services" contribution="contributed">
+ <collection name="pccs_sdk" long-name="PC SAPI" level="pccs">
+ <component name="pcsapi" long-name="PCS API" comment="public interface to PCCS library" contribution="excluded" old_model="PCSuite"/>
+ </collection>
+ <collection name="platform" long-name="Platform" level="plat">
+ <component name="PCConnectivitySolution" long-name="PC Connectivity Solution" comment="USB media module" contribution="excluded" old_model="PCSuite"/>
+ <component name="SLTester" long-name="CC Driver" source="no" contribution="excluded" old_model="PCSuite"/>
+ </collection>
+ <collection name="pccs_installation" long-name="PCCS Installation" level="lib">
+ <component name="pccs" long-name="PCCS Install" comment="Installation project for PCCS" contribution="excluded" old_model="PCSuite"/>
+ <component name="instCcdriver" long-name="CC Driver Install" comment="Installation project for cddriver" old_model="PCSuite"/>
+ </collection>
+ <collection name="pccs_tools" long-name="PCCS Tools" level="lib">
+ <component name="ConfServerCRCTest" long-name="Conf Server CRC Test" comment="test tool" contribution="excluded" old_model="PCSuite"/>
+ <component name="SLTester" comment="test tool" contribution="excluded" old_model="PCSuite"/>
+ </collection>
+ </block>
+ <block long-name="Remote Service Applications" tech_domain="de" level="services" name="remotesrvapps" levels="framework server plugin" contribution="contributed">
+ <collection name="upnpavcontrolpoint" id="upnpavcontrolpoint" long-name="UPnP A/V Control Point" level="plugin" contribution="contributed">
+ <component name="avcontrolframework" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontrolpoint" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpavcontrolpoint\avcontrolframework" source_size="567264.0"/>
+ <component name="avcpengine" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontrolpoint" comment="" contribution="contributed"/>
+ <component name="avcpengineclient" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontrolpoint" comment="" contribution="contributed"/>
+ <component name="upnpaccessplugin" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontrolpoint" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="upnpmediaserver" id="upnpmediaserver" long-name="UPnP Media Server" level="server" contribution="contributed">
+ <component name="avobjects" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpmediaserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpmediaserver\avobjects" source_size="1176562.2"/>
+ <component name="connectionmanagerservice" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpmediaserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpmediaserver\connectionmanagerservice" source_size="379476.9"/>
+ <component name="contentdirectoryservice" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpmediaserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpmediaserver\contentdirectoryservice" source_size="2320208.7"/>
+ <component name="mediaserverclient" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpmediaserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpmediaserver\mediaserverclient" source_size="476093.1"/>
+ <component name="mediaserverengine" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpmediaserver" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\mw\upnpservices\upnpmediaserver\mediaserverengine" source_size="134571.9"/>
+ </collection>
+ <collection name="upnpsharing" id="upnpsharing" long-name="UPnP Sharing" level="server" contribution="contributed">
+ <component name="applicationengine" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsharing" comment="" contribution="contributed"/>
+ <component name="upnpcontentserver" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsharing" comment="" contribution="contributed"/>
+ <component name="upnpdlnaprofiler" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsharing" comment="" contribution="contributed"/>
+ <component name="upnpsecurity" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsharing" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="upnpsettings" id="upnpsettings" long-name="UPnP Settings" level="plugin" contribution="contributed">
+ <component name="appwizard" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsettings" comment="" contribution="contributed"/>
+ <component name="multiselectionui" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsettings" comment="" contribution="contributed"/>
+ <component name="upnpgsplugin" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsettings" comment="" contribution="contributed"/>
+ <component name="upnpsettingsengine" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsettings" comment="" contribution="contributed"/>
+ <component name="upnpsharingui" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsettings" comment="" contribution="contributed"/>
+ <component name="upnpwlaniap" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpsettings" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="upnpmpxplugins" id="upnpmpxplugins" long-name="UPnP MPX Plugins" level="plugin" contribution="contributed">
+ <component name="upnpplaybackplugins" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpmpxplugins" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="upnpharvester" id="upnpharvester" long-name="UPnP Harvester" level="server" contribution="contributed">
+ <component name="cdssync" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpharvester" comment="" contribution="contributed"/>
+ <component name="common" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpharvester" comment="" contribution="contributed"/>
+ <component name="mdhserver" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpharvester" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="upnpframework" id="upnpframework" long-name="UPnP Framework" level="framework" contribution="contributed">
+ <component name="upnpaiwengine" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnpaiwprovider" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnpbrowse" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnpcommand" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnpcommonui" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnpextensionpluginif" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnpfiletransferengine" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnpmusicadapter" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ <component name="upnputilities" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpframework" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="upnpavcontroller" id="upnpavcontroller" long-name="UPnP A/V Controller" level="server" contribution="contributed">
+ <component name="upnpavcontrollerclient" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontroller" comment="" contribution="contributed"/>
+ <component name="upnpavcontrollerhelper" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontroller" comment="" contribution="contributed"/>
+ <component name="upnpavcontrollerserver" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontroller" comment="" contribution="contributed"/>
+ <component name="upnpxmlparser" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="upnpavcontroller" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="homesync" id="homesync" long-name="Home Sync" level="framework" contribution="contributed">
+ <component name="contentmanager" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="homesync" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="homemedia" id="homemedia" long-name="Home Media" level="framework" contribution="contributed">
+ <component name="homemedia" old_model="s60" old_layer="mw" old_package="upnpservices" old_collection="homemedia" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="File Manager Apps" tech_domain="pr" level="apps" name="files" levels="unused support apps" contribution="contributed">
+ <collection name="filemanager" id="FileManager" long-name="File Manager" level="apps" contribution="contributed">
+ <component name="GFLM.dll=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\GFLM.dll=binary" source_size="0.0"/>
+ <component name="filemanagerbkupengine.dll=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\filemanagerbkupengine.dll=binary" source_size="0.0"/>
+ <component name="filemanagerschbkup.exe=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\filemanagerschbkup.exe=binary" source_size="0.0"/>
+ <component name="FileManagerEngine.dll=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\FileManagerEngine.dll=binary" source_size="0.0"/>
+ <component name="FileManagerView.dll=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\FileManagerView.dll=binary" source_size="0.0"/>
+ <component name="FileManager.exe=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\FileManager.exe=binary" source_size="0.0"/>
+ <component name="filemanagerbkupplugin.dll=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\filemanagerbkupplugin.dll=binary" source_size="0.0"/>
+ <component name="filemanageraiwprovider.dll=binary" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="FileManager" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\FileManager\filemanageraiwprovider.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="filesystemuis" id="filesystemuis" long-name="File System UIs" level="support" contribution="contributed">
+ <component name="memscaneng" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="filesystemuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\filesystemuis\memscaneng" source_size="598475.7"/>
+ <component name="memstatepopup" old_model="s60" old_layer="app" old_package="filemanageruis" old_collection="filesystemuis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\filemanageruis\filesystemuis\memstatepopup" source_size="321549.9"/>
+ </collection>
+ </block>
+ <block long-name="Contacts Apps" tech_domain="pr" level="apps" span="2" name="contacts" levels="engine services ui" contribution="contributed">
+ <collection name="contactextensions" id="contactextensions" long-name="Contact Extensions" level="services" contribution="contributed">
+ <component name="predefinedcontacts" old_model="s60" old_layer="app" old_package="contacts" old_collection="contactextensions" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\contactextensions\predefinedcontacts" source_size="135815.4"/>
+ </collection>
+ <collection name="logsui" id="logsui" long-name="Logs UI" level="ui" contribution="contributed">
+ <component name="logsserviceextension" old_model="s60" old_layer="app" old_package="contacts" old_collection="logsui" comment="" contribution="contributed"/>
+ <component name="LogsEng.dll=binary" old_model="s60" old_layer="app" old_package="contacts" old_collection="logsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\logsui\LogsEng.dll=binary" source_size="0.0"/>
+ <component name="AocCtView.dll=binary" old_model="s60" old_layer="app" old_package="contacts" old_collection="logsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\logsui\AocCtView.dll=binary" source_size="0.0"/>
+ <component name="Logs.exe=binary" old_model="s60" old_layer="app" old_package="contacts" old_collection="logsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\logsui\Logs.exe=binary" source_size="0.0"/>
+ <component name="LogsPlugin.dll=binary" old_model="s60" old_layer="app" old_package="contacts" old_collection="logsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\logsui\LogsPlugin.dll=binary" source_size="0.0"/>
+ <component name="LogsIndicatorPlugin.dll=binary" old_model="s60" old_layer="app" old_package="contacts" old_collection="logsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\logsui\LogsIndicatorPlugin.dll=binary" source_size="0.0"/>
+ <component name="LogsClient.dll=binary" old_model="s60" old_layer="app" old_package="contacts" old_collection="logsui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\logsui\LogsClient.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="phonebookui" id="phonebookui" long-name="Phonebook UI" level="ui" contribution="contributed">
+ <component name="Phonebook" old_model="s60" old_layer="app" old_package="contacts" old_collection="phonebookui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\phonebookui\Phonebook" source_size="14787705.3"/>
+ <component name="Phonebook2" old_model="s60" old_layer="app" old_package="contacts" old_collection="phonebookui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\phonebookui\Phonebook2" source_size="6441441.9"/>
+ <component name="Speeddial" old_model="s60" old_layer="app" old_package="contacts" old_collection="phonebookui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\contacts\phonebookui\Speeddial" source_size="2079327.0"/>
+ </collection>
+ <collection name="phonebookengines" id="phonebookengines" long-name="Phonebook Engines" level="engine" contribution="contributed">
+ <component name="contactsmodel" original-name="Contacts Model" long-name="Contacts Model" id="Contacts Model" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM App Services" comment="" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="6276397">
+ <unit version="2" bldFile="app/contacts/phonebookengines/contactsmodel/groupsql" mrp="app/contacts/phonebookengines/contactsmodel/groupsql/app-engines_cntmodel.mrp"/>
+ <unit mrp="app/contacts/phonebookengines/contactsmodel/group/app-engines_cntmodel.mrp" version="1" removed="9.5" bldFile="app/contacts/phonebookengines/contactsmodel/group"/>
+ <unit version="1" bldFile="app/contacts/phonebookengines/contactsmodel/group" mrp="app/contacts/phonebookengines/contactsmodel/group/app-engines_cntmodel.mrp"/>
+ </component>
+ <component name="CntFindPlugin" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="phonebookengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\contactservices\phonebookengines\CntFindPlugin" source_size="0.0"/>
+ <component name="CntSortPlugin" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="phonebookengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\contactservices\phonebookengines\CntSortPlugin" source_size="0.0"/>
+ <component name="VirtualPhonebook" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="phonebookengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\contactservices\phonebookengines\VirtualPhonebook" source_size="0.0"/>
+ </collection>
+ <collection name="ccservices" id="ccservices" long-name="CC Services" level="services" contribution="contributed">
+ <component name="cmsservices" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="ccservices" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="presencecache" id="presencecache" long-name="Presence Cache" level="engine" contribution="contributed">
+ <component name="presencecacheutils" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="presencecache" comment="" contribution="contributed"/>
+ <component name="presencecacheserver2" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="presencecache" comment="" contribution="contributed"/>
+ <component name="presencecacheclient2" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="presencecache" comment="" contribution="contributed"/>
+ <component name="tsrc" old_model="s60" old_layer="mw" old_package="contactservices" old_collection="presencecache" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="predictivesearch" long-name="Predictive Search" id="psengine" contribution="contributed">
+ <component name="adapters" old_model="s60" old_layer="mw" old_package="searchengines" old_collection="psengine" comment="" contribution="contributed"/>
+ <component name="PcsAlgorithm" old_model="s60" old_layer="mw" old_package="searchengines" old_collection="psengine" comment="" contribution="contributed"/>
+ <component name="PcsServer" old_model="s60" old_layer="mw" old_package="searchengines" old_collection="psengine" comment="" contribution="contributed"/>
+ <component name="PcsServerClientAPI" old_model="s60" old_layer="mw" old_package="searchengines" old_collection="psengine" comment="" contribution="contributed"/>
+ <component name="PcsUtils" old_model="s60" old_layer="mw" old_package="searchengines" old_collection="psengine" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="pimprotocols" original-name="PIM Protocols" long-name="PIM Protocols" id="PIM Protocols" level="services" contribution="contributed">
+ <component name="phonebooksync" original-name="Phonebook Sync" long-name="Phonebook Sync" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM Protocols" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="972488">
+ <unit bldFile="app/contacts/pimprotocols/phonebooksync/group" mrp="app/contacts/pimprotocols/phonebooksync/group/telephony_phbksync.mrp"/>
+ </component>
+ <component name="pbap" original-name="Bluetooth PBAP" long-name="Bluetooth PBAP" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM Protocols" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="83953">
+ <unit bldFile="app/contacts/pimprotocols/pbap/group" mrp="app/contacts/pimprotocols/pbap/group/bluetooth_accesshost.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Organizer Application Suite" tech_domain="pr" level="apps" span="2" name="organizer" levels="engine services ui" contribution="contributed">
+ <collection name="alarmui" id="alarmui" long-name="Alarm UI" level="ui" contribution="contributed">
+ <component name="AlmAlert.dll=binary" old_model="s60" old_layer="app" old_package="organizer" old_collection="alarmui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\alarmui\AlmAlert.dll=binary" source_size="0.0"/>
+ <component name="AknAlarmService.dll=binary" old_model="s60" old_layer="app" old_package="organizer" old_collection="alarmui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\alarmui\AknAlarmService.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="calendarui" id="calendarui" long-name="Calendar UI" level="ui" contribution="contributed">
+ <component name="AIPlugins" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\calendarui\AIPlugins" source_size="83233.2"/>
+ <component name="Application" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\calendarui\Application" source_size="435037.8"/>
+ <component name="commonutils" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed"/>
+ <component name="controller" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="customisation" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed"/>
+ <component name="customisationmanager" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed"/>
+ <component name="Editors" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\calendarui\Editors" source_size="227097.0"/>
+ <component name="globaldata" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed"/>
+ <component name="missedalarmindicatorplugin" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed"/>
+ <component name="notifier" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed"/>
+ <component name="RegionalPlugins" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\calendarui\RegionalPlugins" source_size="70825.2"/>
+ <component name="server" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="settings" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\calendarui\settings" source_size="41913.0"/>
+ <component name="views" old_model="s60" old_layer="app" old_package="organizer" old_collection="calendarui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="clock2" id="clock2" long-name="Clock2" level="ui" contribution="contributed">
+ <component name="clockengines" old_model="s60" old_layer="app" old_package="organizer" old_collection="clock2" comment="" contribution="contributed"/>
+ <component name="clockui" old_model="s60" old_layer="app" old_package="organizer" old_collection="clock2" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="meetingui" id="meetingui" long-name="Meeting UI" level="ui" contribution="contributed">
+ <component name="AgnEntryUi" old_model="s60" old_layer="app" old_package="organizer" old_collection="meetingui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\meetingui\AgnEntryUi" source_size="9116.7"/>
+ <component name="AttendeeView" old_model="s60" old_layer="app" old_package="organizer" old_collection="meetingui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\meetingui\AttendeeView" source_size="1090485.6"/>
+ <component name="meetingrequestutils" old_model="s60" old_layer="app" old_package="organizer" old_collection="meetingui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\meetingui\meetingrequestutils" source_size="80392.8"/>
+ <component name="meetingrequestviewers" old_model="s60" old_layer="app" old_package="organizer" old_collection="meetingui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\meetingui\meetingrequestviewers" source_size="3751391.4"/>
+ </collection>
+ <collection name="notepad" id="notepad" long-name="Notepad" level="ui" contribution="contributed">
+ <component name="notepad1" old_model="s60" old_layer="app" old_package="organizer" old_collection="notepad" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\notepad\notepad1" source_size="2263953.6"/>
+ <component name="TxtRecog" old_model="s60" old_layer="app" old_package="organizer" old_collection="notepad" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\notepad\TxtRecog" source_size="150609.9"/>
+ </collection>
+ <collection name="searchui" id="searchui" long-name="Search UI" level="ui" contribution="contributed">
+ <component name="searchapp" old_model="s60" old_layer="app" old_package="organizer" old_collection="searchui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\organizer\searchui\searchapp" source_size="9466007.7"/>
+ </collection>
+ <collection name="calendarengines" id="calendarengines" long-name="Calendar Engines" level="engine" contribution="contributed">
+ <component name="AgnVersit2" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="calendarengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\organizerservices\calendarengines\AgnVersit2" source_size="0.0"/>
+ <component name="CalenImp" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="calendarengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\organizerservices\calendarengines\CalenImp" source_size="0.0"/>
+ <component name="CalenInterimUtils" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="calendarengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\organizerservices\calendarengines\CalenInterimUtils" source_size="0.0"/>
+ <component name="CalenLauncher" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="calendarengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\organizerservices\calendarengines\CalenLauncher" source_size="0.0"/>
+ <component name="Versit2" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="calendarengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\organizerservices\calendarengines\Versit2" source_size="0.0"/>
+ </collection>
+ <collection name="meetingrequestengines" id="meetingrequestengines" long-name="Meeting Request Engines" level="engine" contribution="contributed">
+ <component name="mrmailboxutils" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="meetingrequestengines" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\organizerservices\meetingrequestengines\mrmailboxutils" source_size="0.0"/>
+ </collection>
+ <collection name="alarmengines" id="alarmengines" long-name="Alarm Engines" level="engine" contribution="contributed">
+ <component name="missedalarmstore" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="alarmengines" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="searchfw" id="searchfw" long-name="Search Framework" level="services" contribution="contributed">
+ <component name="coresearchfw" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="searchfw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\organizerservices\searchfw\coresearchfw" source_size="0.0"/>
+ <component name="plugins" old_model="s60" old_layer="mw" old_package="organizerservices" old_collection="searchfw" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="pimappservices" original-name="PIM App Services" long-name="PIM App Services" id="PIM App Services" level="services" contribution="contributed">
+ <component name="calendar" original-name="Calendar" long-name="Calendar" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM App Services" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="4061665">
+ <unit version="2" bldFile="os/unref/orphan/comgen/app-engines/calendar/group" mrp="os/unref/orphan/comgen/app-engines/calendar/group/app-engines_calendar.mrp"/>
+ <unit mrp="app/organizer/pimappservices/calendar/group/app-engines_calinterimapi.mrp" version="1" removed="9.5" bldFile="app/organizer/pimappservices/calendar/group"/>
+ <unit version="1" bldFile="app/organizer/pimappservices/calendar/group" mrp="app/organizer/pimappservices/calendar/group/app-engines_calinterimapi.mrp"/>
+ </component>
+ <component name="calendarvcalplugin" original-name="Agenda Versit Plugin" long-name="Calendar vCal Plugin" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM App Services" comment="" plugin="Y" introduced="8.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="47585">
+ <unit version="2" bldFile="os/unref/comgen/app-engines/agnversit2/group" mrp="os/unref/comgen/app-engines/agnversit2/group/app-engines_agnversit2.mrp"/>
+ <unit mrp="os/unref/comgen/app-engines/agnversit/group/app-engines_agnversit.mrp" version="1" bldFile="os/unref/comgen/app-engines/agnversit/group" removed="9.5"/>
+ </component>
+ <component name="appenginesdocs" original-name="Application Engines Documentation" long-name="Application Engines Documentation" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM App Services" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="337609">
+ <unit mrp="app/organizer/pimappservices/appenginesdocs/app-engines_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="officeappeng" original-name="Office App Engines" long-name="Office App Engines" id="Office App Engines" level="engine" contribution="contributed">
+ <component name="datamodel" original-name="Data Engine" long-name="Data Engine" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="Office App Engines" comment="" introduced="5.0" deprecated="9.3" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="app/organizer/officeappeng/datamodel/group/app-engines_damodel.mrp" bldFile="app/organizer/officeappeng/datamodel/group"/>
+ </component>
+ <component name="sheeteng" original-name="Sheet Engine" long-name="Sheet Engine" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="Office App Engines" comment="" introduced="5.0" deprecated="9.3" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="app/organizer/officeappeng/sheeteng/group/app-engines_sheng.mrp" bldFile="app/organizer/officeappeng/sheeteng/group"/>
+ </component>
+ <component name="charteng" original-name="Chart" long-name="Chart" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="Office App Engines" comment="" class="test" introduced="5.0" deprecated="9.3" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="app/organizer/officeappeng/charteng/group/app-engines_chart.mrp"/>
+ </component>
+ <component name="wordeng" original-name="Word Engine" long-name="Word Engine" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="Office App Engines" comment="" introduced="5.0" deprecated="9.3" removed="9.5" contribution="contributed" in_production_device_rom="yes">
+ <unit mrp="app/organizer/officeappeng/wordeng/group/app-engines_wpeng.mrp" bldFile="app/organizer/officeappeng/wordeng/group"/>
+ </component>
+ </collection>
+ <collection name="pimappsupport" original-name="PIM Application Support" long-name="PIM Application Support" id="PIM Application Support" level="engine" contribution="contributed">
+ <component name="vcardandvcal" original-name="vCard and vCal" long-name="vCard and vCal" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM Application Support" comment="" introduced="ER5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="719516">
+ <unit bldFile="app/organizer/pimappsupport/vcardandvcal/group" mrp="app/organizer/pimappsupport/vcardandvcal/group/app-services_versit.mrp"/>
+ </component>
+ <component name="chinesecalendarconverter" original-name="Chinese Calendar Converter" long-name="Chinese Calendar Converter" old_model="MCL" old_layer="Application Services" old_package="PIM" old_collection="PIM Application Support" comment="" introduced="6.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="192091">
+ <unit bldFile="app/organizer/pimappsupport/chinesecalendarconverter/group" mrp="app/organizer/pimappsupport/chinesecalendarconverter/group/app-services_calcon.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Messaging Apps" tech_domain="pr" level="apps" name="messaging" levels="unused 1 2" contribution="contributed">
+ <collection name="messagingappbase" id="SMILEngine" long-name="Messaging App Base" level="2" contribution="contributed">
+ <component name="MsgEditor" long-name="Message Editor" id="MsgEditor" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\MsgEditor" source_size="2136983.1"/>
+ <component name="Sendui" long-name="Send UI" id="Sendui" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="Generic parts of send ui will be split and go to messagingmw." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\Sendui" source_size="1793994.0"/>
+ <component name="msgavkon" long-name="MSG Avkon" id="msgavkon" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="Muiu domain part will be split and goes to messagingmw." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\msgavkon" source_size="1424580.3"/>
+ <component name="smilparser" original-name="SMIL Parser" long-name="SMIL Parser" id="SMIL Parser" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Content Handling" comment="" introduced="7.0s" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="821304">
+ <unit bldFile="app/messaging/messagingappbase/smilparser/GROUP" mrp="app/messaging/messagingappbase/smilparser/GROUP/messaging_gmxml.mrp"/>
+ </component>
+ <component name="obexmtms" original-name="OBEX MTMs" long-name="OBEX MTMs" id="OBEX MTMs" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Plugins" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="447880">
+ <unit bldFile="app/messaging/messagingappbase/obexmtms/Group" mrp="app/messaging/messagingappbase/obexmtms/Group/messaging_obex.mrp"/>
+ </component>
+ <component name="engine" old_model="s60" old_layer="app" old_package="messaging" old_collection="SMILEngine" comment="Exception: the SMILEngine should become a component under messasingappbase with name smilengine." contribution="contributed" in_production_device_rom=""/>
+ <component name="transition" old_model="s60" old_layer="app" old_package="messaging" old_collection="SMILEngine" comment="Exception: the SMILEngine should become a component under messasingappbase with name smilengine." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\SMILEngine\transition" source_size="51258.0"/>
+ <component name="xhtml" old_model="s60" old_layer="app" old_package="messaging" old_collection="SMILEngine" comment="Exception: the SMILEngine should become a component under messasingappbase with name smilengine." contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\SMILEngine\xhtml" source_size="50532.6"/>
+ <component name="mce" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\mce" source_size="4087635.6"/>
+ <component name="mceextraitems" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\mceextraitems" source_size="30843.9"/>
+ <component name="mcesettings" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\mcesettings" source_size="1146767.7"/>
+ <component name="MsgErrorWatcher" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\MsgErrorWatcher" source_size="974705.4"/>
+ <component name="ncnlist" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\ncnlist" source_size="2752827.3"/>
+ <component name="SchemePlugin" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\SchemePlugin" source_size="574008.6"/>
+ <component name="bium" old_model="s60" old_layer="app" old_package="messaging" old_collection="smartmessaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\smartmessaginguis\bium" source_size="126968.1"/>
+ <component name="SmartMessaging" old_model="s60" old_layer="app" old_package="messaging" old_collection="smartmessaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\smartmessaginguis\SmartMessaging" source_size="1671964.8"/>
+ </collection>
+ <collection name="mobilemessaging" id="messagingeditorsandviewers" long-name="Mobile Messaging" level="2" contribution="contributed">
+ <component name="smsmtm" original-name="SMS MTM" long-name="SMS MTM" id="SMS MTM" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Plugins" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1174426">
+ <unit bldFile="app/messaging/mobilemessaging/smsmtm/multimode/Group" mrp="app/messaging/mobilemessaging/smsmtm/multimode/Group/messaging_sms_multimode.mrp"/>
+ </component>
+ <component name="AudioMsg" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\AudioMsg" source_size="1932298.2"/>
+ <component name="mmsui" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\mmsui" source_size="7967412.3"/>
+ <component name="MsgMedia" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\MsgMedia" source_size="429463.2"/>
+ <component name="postcard" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\postcard" source_size="2482427.4"/>
+ <component name="smilui" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\smilui" source_size="5443253.1"/>
+ <component name="SmsUi" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\SmsUi" source_size="2741033.4"/>
+ <component name="smum" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\smum" source_size="1777804.8"/>
+ <component name="UniEditor" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\UniEditor" source_size="5510059.5"/>
+ </collection>
+ <collection name="email" id="Messaging Plugins" level="1" contribution="contributed">
+ <component name="Imum" long-name="Imum" id="Imum" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\Imum" source_size="3953687.1"/>
+ <component name="Mail" long-name="Mail" id="Mail" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messagingeditorsandviewers\Mail" source_size="1602865.5"/>
+ <component name="SyncUIMtms" long-name="Sync UI MTMs" id="SyncUIMtms" old_model="s60" old_layer="app" old_package="messaging" old_collection="messagingeditorsandviewers" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="yes" path="\s60\app\messaging\messagingeditorsandviewers\SyncUIMtms" source_size="2733246.6"/>
+ <component name="EmailNotificationHandler" long-name="Email Notification Handler" id="EmailNotificationHandler" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\EmailNotificationHandler" source_size="161137.5"/>
+ <component name="AlwaysOnlineEmailPlugin" long-name="Always Online Email Plugin" id="AlwaysOnlineEmailPlugin" old_model="s60" old_layer="app" old_package="messaging" old_collection="messaginguis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\messaginguis\AlwaysOnlineEmailPlugin" source_size="560038.5"/>
+ <component name="pop3andsmtpmtm" original-name="POP3 and SMTP MTM" long-name="POP3 and SMTP MTM" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Plugins" comment="" plugin="Y" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="3059398">
+ <unit bldFile="app/messaging/email/pop3andsmtpmtm/group" mrp="app/messaging/email/pop3andsmtpmtm/group/messaging_email.mrp"/>
+ </component>
+ <component name="imap4mtm" original-name="IMAP4 MTM" long-name="IMAP4 MTM" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Plugins" comment="" plugin="Y" introduced="9.2" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="730253">
+ <unit bldFile="app/messaging/email/imap4mtm/group" mrp="app/messaging/email/imap4mtm/group/messaging_email_imap.mrp"/>
+ </component>
+ </collection>
+ <collection name="mmsengine" id="mmsengine" long-name="MMS Engine" level="1" contribution="contributed">
+ <component name="mmssettings" original-name="MMS Settings" long-name="MMS Settings" id="MMS Settings" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" introduced="9.2" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="23357">
+ <unit bldFile="app/messaging/mmsengine/mmssettings/group/" mrp="app/messaging/mmsengine/mmssettings/group/messaging_mmssettings.mrp"/>
+ </component>
+ <component name="mmsconf" original-name="MMS Configuration" long-name="MMS Configuration" id="MMS Configuration" old_model="MCL" old_layer="Application Services" old_package="Messaging" old_collection="Messaging Framework" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1403">
+ <unit mrp="app/messaging/mmsengine/mmssettings/group/messaging_mmssettings-config.mrp"/>
+ </component>
+ <component name="applicationadapter" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\applicationadapter" source_size="6018.9"/>
+ <component name="clientmtm" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\clientmtm" source_size="168118.8"/>
+ <component name="genutils" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\genutils" source_size="154430.1"/>
+ <component name="mmsconninit" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmsconninit" source_size="113717.4"/>
+ <component name="mmsserversettings" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmsserversettings" source_size="42851.1"/>
+ <component name="mmsmessage" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmsmessage" source_size="118342.8"/>
+ <component name="mmshttptransport" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmshttptransport" source_size="32964.3"/>
+ <component name="mmscodec" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmscodec" source_size="152871.0"/>
+ <component name="mmsserver" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmsserver" source_size="198046.8"/>
+ <component name="mmswatcher" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmswatcher" source_size="23768.4"/>
+ <component name="mmspushhandler" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmspushhandler" source_size="82744.2"/>
+ <component name="mmscodecclient" old_model="s60" old_layer="app" old_package="messaging" old_collection="mmsengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\messaging\mmsengine\mmscodecclient" source_size="359244.6"/>
+ </collection>
+ </block>
+ <block long-name="Instant Messaging Apps" tech_domain="pr" level="apps" name="im" levels="support engine apps" contribution="contributed">
+ <collection name="impsengine" id="IMPSengine" long-name="IMPS Engine" level="engine" contribution="contributed">
+ <component name="client" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed"/>
+ <component name="datautils" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\datautils" source_size="72708.9"/>
+ <component name="engsrv" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\engsrv" source_size="893206.2"/>
+ <component name="utils" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed"/>
+ <component name="imapi" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\imapi" source_size="205370.7"/>
+ <component name="imlauncher" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\imlauncher" source_size="6405.3"/>
+ <component name="ImpsDataChannel" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\ImpsDataChannel" source_size="78117.6"/>
+ <component name="ImpsIpCirWatcher" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\ImpsIpCirWatcher" source_size="52810.8"/>
+ <component name="messageencoder" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\messageencoder" source_size="389722.5"/>
+ <component name="impswatcher" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\impswatcher" source_size="243552.6"/>
+ <component name="wvotaparser" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="IMPSengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\IMPSengine\wvotaparser" source_size="9810.3"/>
+ </collection>
+ <collection name="pecengine" id="PECengine" long-name="PEC Engine" level="engine" contribution="contributed">
+ <component name="AttributeLibrary2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\AttributeLibrary2" source_size="676126.8"/>
+ <component name="CoreUtilsLib2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\CoreUtilsLib2" source_size="205953.3"/>
+ <component name="StorageManager2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\StorageManager2" source_size="341056.5"/>
+ <component name="Parser2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed"/>
+ <component name="ListLibrary2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\ListLibrary2" source_size="626820.9"/>
+ <component name="TransferAdapter2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\TransferAdapter2" source_size="246351.9"/>
+ <component name="PresenceServer2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\PresenceServer2" source_size="194395.2"/>
+ <component name="PresenceManager2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\PresenceManager2" source_size="328610.7"/>
+ <component name="JanitorPlugin2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\JanitorPlugin2" source_size="80907.3"/>
+ <component name="PluginServer2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="PECengine" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\PECengine\PluginServer2" source_size="106978.2"/>
+ </collection>
+ <collection name="presadap12" id="presadap12" long-name="Presadap12" level="support" contribution="contributed">
+ <component name="Parser2" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="presadap12" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60=""/>
+ <component name="impsplugin" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="presadap12" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\presadap12\impsplugin" source_size="604283.7"/>
+ </collection>
+ <collection name="wvsettings20" id="wvsettings20" long-name="WV Settings20" level="support" contribution="contributed">
+ <component name="WVSAPSettingsStore.dll=binary" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvsettings20" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvsettings20\WVSAPSettingsStore.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="wvuing" id="wvuing" long-name="WV UI NG" level="apps" contribution="contributed">
+ <component name="imindicatorplugin" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\imindicatorplugin" source_size="143378.4"/>
+ <component name="IMPSConnectionUI" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\IMPSConnectionUI" source_size="775959.0"/>
+ <component name="IMPSServiceSettingsUI" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\IMPSServiceSettingsUI" source_size="343694.1"/>
+ <component name="IMPSAlwaysOnlinePlugin" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\IMPSAlwaysOnlinePlugin" source_size="105138.0"/>
+ <component name="wvvariant" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvvariant" source_size="326441.7"/>
+ <component name="wvuiada" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvuiada" source_size="324691.5"/>
+ <component name="wvuistorage" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvuistorage" source_size="365864.1"/>
+ <component name="wvuipresence" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvuipresence" source_size="563033.7"/>
+ <component name="wvlogger" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvlogger" source_size="330097.8"/>
+ <component name="wvuieng" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvuieng" source_size="1250108.4"/>
+ <component name="ImUtils" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\ImUtils" source_size="76579.8"/>
+ <component name="wvuiprocess" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvuiprocess" source_size="1440026.1"/>
+ <component name="wvcommandutils" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvcommandutils" source_size="223712.4"/>
+ <component name="wvaudiomanager" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvaudiomanager" source_size="39753.9"/>
+ <component name="wvuiave" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\wvuiave" source_size="3711545.4"/>
+ <component name="IMLauncher" old_model="s60" old_layer="app" old_package="imppapplications" old_collection="wvuing" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="" not_used_by_s60="" path="\s60\app\imppapplications\wvuing\IMLauncher" source_size="208641.9"/>
+ </collection>
+ </block>
+ <block long-name="Utility Apps" tech_domain="pr" level="apps" name="utils" levels="empty 1" contribution="contributed">
+ <collection name="extras" id="extras" long-name="Extras" level="1" contribution="contributed">
+ <component name="About" old_model="s60" old_layer="app" old_package="extrapimui" old_collection="extras" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\extrapimui\extras\About" source_size="210406.2"/>
+ <component name="Calcsoft" old_model="s60" old_layer="app" old_package="extrapimui" old_collection="extras" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\extrapimui\extras\Calcsoft" source_size="1350740.4"/>
+ <component name="Converter" old_model="s60" old_layer="app" old_package="extrapimui" old_collection="extras" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\extrapimui\extras\Converter" source_size="609414.9"/>
+ <component name="dictionary" old_model="s60" old_layer="app" old_package="extrapimui" old_collection="extras" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\extrapimui\extras\dictionary" source_size="4347534.0"/>
+ </collection>
+ </block>
+ <block long-name="Chinese Dictionary" tech_domain="pr" level="services" name="dictionary" levels="appl" contribution="contributed">
+ <collection name="userdict" id="UserDict" long-name="User Dictionary" level="appl" contribution="contributed">
+ <component name="UserDict.exe=binary" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="UserDict" comment="" contribution="contributed" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\app\coreuiapps\UserDict\UserDict.exe=binary" source_size="0.0"/>
+ <component name="UserDict.dll=binary" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="UserDict" comment="" contribution="contributed" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\app\coreuiapps\UserDict\UserDict.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Camera Apps" tech_domain="ma" level="apps" name="camera" levels="empty 1" contribution="contributed">
+ <collection name="camerauis" id="camerauis" long-name="Camera UIs" level="1" contribution="contributed">
+ <component name="activepalette" old_model="s60" old_layer="app" old_package="camera" old_collection="camerauis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\camera\camerauis\activepalette" source_size="394692.3"/>
+ <component name="cameraapp" old_model="s60" old_layer="app" old_package="camera" old_collection="camerauis" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\camera\camerauis\cameraapp" source_size="3163520.1"/>
+ </collection>
+ </block>
+ <block long-name="Image Editor Apps" tech_domain="ma" level="apps" name="imgeditor" levels="unused engine ui" contribution="contributed">
+ <collection name="imageeditor" id="imageeditor" long-name="Image Editor" level="ui" contribution="contributed">
+ <component name="EditorProvider" old_model="s60" old_layer="app" old_package="editors" old_collection="imageeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\imageeditor\EditorProvider" source_size="40861.5"/>
+ <component name="IEPB" old_model="s60" old_layer="app" old_package="editors" old_collection="imageeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\imageeditor\IEPB" source_size="12370.2"/>
+ <component name="imageeditorApp" old_model="s60" old_layer="app" old_package="editors" old_collection="imageeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\imageeditor\imageeditorApp" source_size="60881.1"/>
+ <component name="ImageEditorManager" old_model="s60" old_layer="app" old_package="editors" old_collection="imageeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\imageeditor\ImageEditorManager" source_size="33524.4"/>
+ <component name="ImageEditorUI" old_model="s60" old_layer="app" old_package="editors" old_collection="imageeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\imageeditor\ImageEditorUI" source_size="98336.1"/>
+ <component name="PB" old_model="s60" old_layer="app" old_package="editors" old_collection="imageeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\imageeditor\PB" source_size="2393.7"/>
+ <component name="plugins" old_model="s60" old_layer="app" old_package="editors" old_collection="imageeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="imageeditorengine" id="imageeditorengine" long-name="Image Editor Engine" level="engine" contribution="contributed">
+ <component name="EngineWrapper" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="imageeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\imageeditorengine\EngineWrapper" source_size="28757.7"/>
+ <component name="filters" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="imageeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\imageeditorengine\filters" source_size="81834.0"/>
+ <component name="ImageEditorUtils" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="imageeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\imageeditorengine\ImageEditorUtils" source_size="32675.4"/>
+ <component name="JpegRotator" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="imageeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\imageeditorengine\JpegRotator" source_size="42364.8"/>
+ <component name="JpegScaler" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="imageeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\imageeditorengine\JpegScaler" source_size="26272.5"/>
+ <component name="SystemParameters" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="imageeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\imageeditorengine\SystemParameters" source_size="2939.1"/>
+ </collection>
+ </block>
+ <block long-name="Video Editor Apps" tech_domain="ma" level="apps" name="videoeditor" levels="unused engine ui" contribution="contributed">
+ <collection name="videditor" id="videoeditor" long-name="Video Editor" level="ui" contribution="contributed">
+ <component name="ManualVideoEditor" old_model="s60" old_layer="app" old_package="editors" old_collection="videoeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\videoeditor\ManualVideoEditor" source_size="438999.0"/>
+ <component name="SimpleCutVideo" old_model="s60" old_layer="app" old_package="editors" old_collection="videoeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\videoeditor\SimpleCutVideo" source_size="70263.6"/>
+ <component name="SimpleVideoEditor" old_model="s60" old_layer="app" old_package="editors" old_collection="videoeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\videoeditor\SimpleVideoEditor" source_size="57529.2"/>
+ <component name="TrimForMms" old_model="s60" old_layer="app" old_package="editors" old_collection="videoeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\videoeditor\TrimForMms" source_size="35215.2"/>
+ <component name="VideoEditorCommon" old_model="s60" old_layer="app" old_package="editors" old_collection="videoeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\videoeditor\VideoEditorCommon" source_size="443053.2"/>
+ <component name="VideoEditorUiComponents" old_model="s60" old_layer="app" old_package="editors" old_collection="videoeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\videoeditor\VideoEditorUiComponents" source_size="442531.5"/>
+ <component name="VideoProvider" old_model="s60" old_layer="app" old_package="editors" old_collection="videoeditor" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\editors\videoeditor\VideoProvider" source_size="31047.3"/>
+ </collection>
+ <collection name="videoeditorengine" id="videoeditorengine" long-name="Video Editor Engine" level="engine" contribution="contributed">
+ <component name="audioeditorengine" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="videoeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\videoeditorengine\audioeditorengine" source_size="286943.1"/>
+ <component name="avcedit" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="videoeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\videoeditorengine\avcedit" source_size="112244.1"/>
+ <component name="h263decoder" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="videoeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\videoeditorengine\h263decoder" source_size="423831.0"/>
+ <component name="mp3aacManipLib" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="videoeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\videoeditorengine\mp3aacManipLib" source_size="152051.7"/>
+ <component name="vedengine" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="videoeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\videoeditorengine\vedengine" source_size="445873.5"/>
+ <component name="vedtranscoder" old_model="s60" old_layer="mw" old_package="editorengines" old_collection="videoeditorengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\editorengines\videoeditorengine\vedtranscoder" source_size="120295.2"/>
+ </collection>
+ </block>
+ <block long-name="Gallery Apps" tech_domain="ma" level="apps" name="gallery" levels="empty 1" contribution="contributed">
+ <collection name="mediagallery" id="mediagallery" long-name="Media Gallery" level="1" contribution="contributed">
+ <component name="MediaGallery2" old_model="s60" old_layer="app" old_package="gallery" old_collection="mediagallery" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\gallery\mediagallery\MediaGallery2" source_size="10841121.3"/>
+ </collection>
+ </block>
+ <block long-name="Image Viewer UIs" tech_domain="ma" level="services" name="imgvieweruis" levels="unused" contribution="contributed">
+ <collection name="imageviewer" id="ImageViewer" long-name="Image Viewer" level="unused" contribution="contributed">
+ <component name="ImageViewer.exe=binary" old_model="s60" old_layer="app" old_package="imgviewer" old_collection="ImageViewer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\imgviewer\ImageViewer\ImageViewer.exe=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Video Player Apps" tech_domain="ma" level="apps" name="videoplayer" levels="support apps" contribution="contributed">
+ <collection name="lwplayer" id="LWPlayer" long-name="LW Player" level="apps" contribution="contributed">
+ <component name="LWPlayer.exe=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="LWPlayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\LWPlayer\LWPlayer.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="mediaplayer" id="MediaPlayer" long-name="Media Player" level="apps" contribution="contributed">
+ <component name="MPEngine.dll=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaPlayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaPlayer\MPEngine.dll=binary" source_size="0.0"/>
+ <component name="MPRecognizer.dll=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaPlayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaPlayer\MPRecognizer.dll=binary" source_size="0.0"/>
+ <component name="MPFileDetailsDialog.dll=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaPlayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaPlayer\MPFileDetailsDialog.dll=binary" source_size="0.0"/>
+ <component name="MediaPlayer.exe=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaPlayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaPlayer\MediaPlayer.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="mediasettings" id="MediaSettings" long-name="Media Settings" level="support" contribution="contributed">
+ <component name="MPSettEngine.dll=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaSettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaSettings\MPSettEngine.dll=binary" source_size="0.0"/>
+ <component name="MPSettROPModel.dll=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaSettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaSettings\MPSettROPModel.dll=binary" source_size="0.0"/>
+ <component name="MPSettBase.dll=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaSettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaSettings\MPSettBase.dll=binary" source_size="0.0"/>
+ <component name="MediaSettings.exe=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaSettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaSettings\MediaSettings.exe=binary" source_size="0.0"/>
+ <component name="GSVideoPlugin.dll=binary" old_model="s60" old_layer="app" old_package="mmplayer" old_collection="MediaSettings" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mmplayer\MediaSettings\GSVideoPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Photos" tech_domain="ma" level="apps" name="photos" levels="fw ui app" contribution="contributed">
+ <collection name="activedataplugin" id="activedataplugin" long-name="Active Data Plugin" level="ui" contribution="contributed">
+ <component name="test" old_model="s60" old_layer="app" old_package="photos" old_collection="activedataplugin" comment="" contribution="contributed"/>
+ <component name="glxactivedataplugin.dll=binary" old_model="s60" old_layer="app" old_package="photos" old_collection="activedataplugin" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="collectionframework" id="collectionframework" long-name="Collection Framework" level="fw" contribution="contributed">
+ <component name="datasource" old_model="s60" old_layer="app" old_package="photos" old_collection="collectionframework" comment="" contribution="contributed"/>
+ <component name="plugins" old_model="s60" old_layer="app" old_package="photos" old_collection="collectionframework" comment="" contribution="contributed"/>
+ <component name="test" old_model="s60" old_layer="app" old_package="photos" old_collection="collectionframework" comment="" contribution="contributed"/>
+ <component name="thumbnailcreator" old_model="s60" old_layer="app" old_package="photos" old_collection="collectionframework" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="common" id="common" long-name="Common" level="fw" contribution="contributed">
+ <component name="test" old_model="s60" old_layer="app" old_package="photos" old_collection="common" comment="" contribution="contributed"/>
+ <component name="glxcommon.dll=binary" old_model="s60" old_layer="app" old_package="photos" old_collection="common" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="commonui" id="commonui" long-name="Common UI" level="ui" contribution="contributed">
+ <component name="test" old_model="s60" old_layer="app" old_package="photos" old_collection="commonui" comment="" contribution="contributed"/>
+ <component name="glxcommonui.dll=binary" old_model="s60" old_layer="app" old_package="photos" old_collection="commonui" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="controllers" id="controllers" long-name="Controllers" level="ui" contribution="contributed">
+ <component name="collectionmanager" old_model="s60" old_layer="app" old_package="photos" old_collection="controllers" comment="" contribution="contributed"/>
+ <component name="fetcher" old_model="s60" old_layer="app" old_package="photos" old_collection="controllers" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="gallery" id="gallery" long-name="Gallery" level="app" contribution="contributed">
+ <component name="glx.exe=binary" old_model="s60" old_layer="app" old_package="photos" old_collection="gallery" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="picons" id="icons" long-name="PIcons" level="ui" contribution="contributed">
+ <component name="picons compo" old_model="s60" old_layer="app" old_package="photos" old_collection="icons" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="logging" id="logging" long-name="Logging" level="fw" contribution="contributed">
+ <component name="app" old_model="s60" old_layer="app" old_package="photos" old_collection="logging" comment="" contribution="contributed"/>
+ <component name="client" old_model="s60" old_layer="app" old_package="photos" old_collection="logging" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="slideshow" id="slideshow" long-name="Slideshow" level="app" contribution="contributed">
+ <component name="engine" old_model="s60" old_layer="app" old_package="photos" old_collection="slideshow" comment="" contribution="contributed"/>
+ <component name="settingsdialog" old_model="s60" old_layer="app" old_package="photos" old_collection="slideshow" comment="" contribution="contributed"/>
+ <component name="view" old_model="s60" old_layer="app" old_package="photos" old_collection="slideshow" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="test" id="test" long-name="Test" level="app" contribution="contributed">
+ <component name="viewframework" old_model="s60" old_layer="app" old_package="photos" old_collection="test" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="viewframework" id="viewframework" long-name="View Framework" level="fw" contribution="contributed">
+ <component name="commandhandlers" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="dataprovider" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="drmutility" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="layouts" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="medialists" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="plugins" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="texturemanager" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="tvout" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="uiutilities" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ <component name="views" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="visuallistmanager" old_model="s60" old_layer="app" old_package="photos" old_collection="viewframework" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="Video Center" tech_domain="ma" level="apps" name="videocenter" levels="eng ui app" contribution="contributed">
+ <collection name="mpxmyvideoscollection" id="mpxmyvideoscollection" long-name="MPX My Videos Collection" level="app" contribution="contributed">
+ <component name="vcxmyvideoscollectionplugin.dll=binary" old_model="s60" old_layer="app" old_package="videocenter" old_collection="mpxmyvideoscollection" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="nsmyvideosview" id="nsmyvideosview" long-name="NS My Videos View" level="app" contribution="contributed">
+ <component name="nsmyvideos" old_model="s60" old_layer="app" old_package="videocenter" old_collection="nsmyvideosview" comment="" contribution="contributed"/>
+ <component name="nsmyvideosplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="nsmyvideosview" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="vccommon" id="vccommon" long-name="Video Center Common" level="eng" contribution="contributed">
+ <component name="iapselection" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vccommon" comment="" contribution="contributed"/>
+ <component name="notifierplugins" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vccommon" comment="" contribution="contributed"/>
+ <component name="utils" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vccommon" comment="" contribution="contributed"/>
+ <component name="viewmessageutility" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vccommon" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="vcengines" id="vcengines" long-name="Video Center Engines" level="eng" contribution="contributed">
+ <component name="livetvepgengine" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="livetvschedulerplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="livetvutils" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="mrssplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="networkengine" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="scheduleddlplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="server" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="serviceprovisioning" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="tunerengine" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="videostorage" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="voddownloadplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ <component name="xmltvplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcengines" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="vcnsuis" id="vcnsuis" long-name="Video Center NS UIs" level="ui" contribution="contributed">
+ <component name="vcnsahplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcnsuis" comment="" contribution="contributed"/>
+ <component name="vcnsapp" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcnsuis" comment="" contribution="contributed"/>
+ <component name="vcnschplugin" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcnsuis" comment="" contribution="contributed"/>
+ <component name="vcnslivetv" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcnsuis" comment="" contribution="contributed"/>
+ <component name="vcnssettings" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcnsuis" comment="" contribution="contributed"/>
+ <component name="vcnsvodui" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcnsuis" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="vcplayer" id="vcplayer" long-name="Video Center Player" level="app" contribution="contributed">
+ <component name="core" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcplayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="defaultview" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcplayer" comment="" contribution="contributed"/>
+ <component name="plugins" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcplayer" comment="" contribution="contributed"/>
+ <component name="utils" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcplayer" comment="" contribution="contributed"/>
+ <component name="vcnsplayerview" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcplayer" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="vcuis" id="vcuis" long-name="Video Center UIs" level="ui" contribution="contributed">
+ <component name="mainui" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcuis" comment="" contribution="contributed"/>
+ <component name="settingsui" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcuis" comment="" contribution="contributed"/>
+ <component name="vclivetv" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcuis" comment="" contribution="contributed"/>
+ <component name="videostorageui" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcuis" comment="" contribution="contributed"/>
+ <component name="vodui" old_model="s60" old_layer="app" old_package="videocenter" old_collection="vcuis" comment="" contribution="contributed"/>
+ </collection>
+ </block>
+ <block long-name="Multimedia UIs" tech_domain="ma" level="services" name="mmuis" levels="1 2" contribution="contributed">
+ <collection name="serviceplugins" id="serviceplugins" long-name="Service Plugins" level="2" contribution="contributed">
+ <component name="collectionplugins" old_model="s60" old_layer="app" old_package="mpxplugins" old_collection="serviceplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mpxplugins\serviceplugins\collectionplugins" source_size="470607.9"/>
+ <component name="playbackplugins" old_model="s60" old_layer="app" old_package="mpxplugins" old_collection="serviceplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mpxplugins\serviceplugins\playbackplugins" source_size="93406.8"/>
+ <component name="playlistplugins" old_model="s60" old_layer="app" old_package="mpxplugins" old_collection="serviceplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mpxplugins\serviceplugins\playlistplugins" source_size="56613.3"/>
+ <component name="screensaverplugins" old_model="s60" old_layer="app" old_package="mpxplugins" old_collection="serviceplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mpxplugins\serviceplugins\screensaverplugins" source_size="66366.0"/>
+ <component name="visualizationplugins" old_model="s60" old_layer="app" old_package="mpxplugins" old_collection="serviceplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\mpxplugins\serviceplugins\visualizationplugins" source_size="211344.6"/>
+ </collection>
+ <collection name="viewplugins" id="viewplugins" long-name="View Plugins" level="2" contribution="contributed">
+ <component name="plugins" old_model="s60" old_layer="app" old_package="mpxplugins" old_collection="viewplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="views" old_model="s60" old_layer="app" old_package="mpxplugins" old_collection="viewplugins" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ </block>
+ <block long-name="Music Player Apps" tech_domain="ma" level="apps" name="musicplayer" levels="plugins support apps" contribution="contributed">
+ <collection name="musicvisualization" id="MusicVisualization" long-name="Music Visualization" level="plugins" contribution="contributed">
+ <component name="MusicVisualizationPlugin.dll=binary" old_model="s60" old_layer="app" old_package="music" old_collection="MusicVisualization" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\music\MusicVisualization\MusicVisualizationPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="cameseui" id="cameseui" long-name="Camese UI" level="support" contribution="contributed">
+ <component name="browserview" old_model="s60" old_layer="app" old_package="music" old_collection="cameseui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\music\cameseui\browserview" source_size="60854.7"/>
+ <component name="browserviewplugin" old_model="s60" old_layer="app" old_package="music" old_collection="cameseui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\music\cameseui\browserviewplugin" source_size="4453.2"/>
+ <component name="common" old_model="s60" old_layer="app" old_package="music" old_collection="cameseui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="drmhandler" old_model="s60" old_layer="app" old_package="music" old_collection="cameseui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\music\cameseui\drmhandler" source_size="26561.1"/>
+ </collection>
+ <collection name="mpxmusicplayer" id="mpxmusicplayer" long-name="MPX Music Player" level="apps" contribution="contributed">
+ <component name="activeidle" old_model="s60" old_layer="app" old_package="music" old_collection="mpxmusicplayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\music\mpxmusicplayer\activeidle" source_size="49668.3"/>
+ <component name="app" old_model="s60" old_layer="app" old_package="music" old_collection="mpxmusicplayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="commonui" old_model="s60" old_layer="app" old_package="music" old_collection="mpxmusicplayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="mediakeyhandler" old_model="s60" old_layer="app" old_package="music" old_collection="mpxmusicplayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\music\mpxmusicplayer\mediakeyhandler" source_size="60797.7"/>
+ <component name="metadatahandler" old_model="s60" old_layer="app" old_package="music" old_collection="mpxmusicplayer" comment="" contribution="contributed"/>
+ <component name="MPVolumePopUp" old_model="s60" old_layer="app" old_package="music" old_collection="mpxmusicplayer" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\music\mpxmusicplayer\MPVolumePopUp" source_size="47943.9"/>
+ </collection>
+ </block>
+ <block long-name="Radio Apps" tech_domain="ma" level="apps" name="radio" levels="unused engine ui" contribution="contributed">
+ <collection name="fmradio" id="FMRadio" long-name="FM Radio" level="ui" contribution="contributed">
+ <component name="FMRadio.exe=binary" old_model="s60" old_layer="app" old_package="radio" old_collection="FMRadio" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\radio\FMRadio\FMRadio.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="fmradioengine" id="fmradioengine" long-name="FM Radio Engine" level="engine" contribution="contributed">
+ <component name="FMRadioEngine.dll=binary" old_model="s60" old_layer="app" old_package="radio" old_collection="fmradioengine" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\radio\fmradioengine\FMRadioEngine.dll=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Voice Recorder Apps" tech_domain="ma" level="apps" name="voicerec" levels="empty 1" contribution="contributed">
+ <collection name="voicerecorder" id="VoiceRecorder" long-name="Voice Recorder" level="1" contribution="contributed">
+ <component name="GSPlugin" old_model="s60" old_layer="app" old_package="voicerec" old_collection="VoiceRecorder" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\voicerec\VoiceRecorder\GSPlugin" source_size="12676.2"/>
+ <component name="VoiceRecorderUtils.dll=binary" old_model="s60" old_layer="app" old_package="voicerec" old_collection="VoiceRecorder" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\voicerec\VoiceRecorder\VoiceRecorderUtils.dll=binary" source_size="0.0"/>
+ <component name="VoiceRecorderRecView.dll=binary" old_model="s60" old_layer="app" old_package="voicerec" old_collection="VoiceRecorder" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\voicerec\VoiceRecorder\VoiceRecorderRecView.dll=binary" source_size="0.0"/>
+ <component name="NewService.dll=binary" old_model="s60" old_layer="app" old_package="voicerec" old_collection="VoiceRecorder" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\voicerec\VoiceRecorder\NewService.dll=binary" source_size="0.0"/>
+ <component name="VoiceRecorder.exe=binary" old_model="s60" old_layer="app" old_package="voicerec" old_collection="VoiceRecorder" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\voicerec\VoiceRecorder\VoiceRecorder.exe=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Screen Saver Apps" tech_domain="ui" level="apps" name="screensaver" levels="empty 1" contribution="contributed">
+ <collection name="scrsaver" id="screensaver" long-name="Screen Saver" level="1" contribution="contributed">
+ <component name="plugins" old_model="s60" old_layer="mw" old_package="classicui" old_collection="screensaver" comment="" contribution="contributed"/>
+ <component name="screensaveraiwplugin" old_model="s60" old_layer="mw" old_package="classicui" old_collection="screensaver" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\classicui\screensaver\screensaveraiwplugin" source_size="179900.1"/>
+ <component name="screensaver.exe=binary" old_model="s60" old_layer="mw" old_package="classicui" old_collection="screensaver" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\classicui\screensaver\screensaver.exe=binary" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Homescreen Apps" tech_domain="ui" level="apps" name="homescreen" levels="unused fw apps" contribution="contributed">
+ <collection name="appshell" id="AppShell" long-name="App Shell" level="apps" contribution="contributed">
+ <component name="bganimation" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\bganimation" source_size="77797.5"/>
+ <component name="Extensions" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\Extensions" source_size="11298.9"/>
+ <component name="fgcomponent" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\fgcomponent" source_size="223730.4"/>
+ <component name="Handlers" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\Handlers" source_size="16310.1"/>
+ <component name="Interface" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\Interface" source_size="2062.8"/>
+ <component name="menu3" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\menu3" source_size="3129083.1"/>
+ <component name="menucomponent" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\menucomponent" source_size="2864829.3"/>
+ <component name="Model" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\Model" source_size="108201.9"/>
+ <component name="oomplugin" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\oomplugin" source_size="0.0"/>
+ <component name="presentationmanager" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\presentationmanager" source_size="700120.5"/>
+ <component name="pslnhasplugin" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="AppShell" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\coreuiapps\AppShell\pslnhasplugin" source_size="17268.6"/>
+ </collection>
+ <collection name="idlehomescreen" id="activeidle" long-name="Active Idle" contribution="contributed">
+ <component name="ActiveIdle2" old_model="s60" old_layer="mw" old_package="uishellservices" old_collection="activeidle" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\uishellservices\activeidle\ActiveIdle2" source_size="9350176.5"/>
+ </collection>
+ </block>
+ <block long-name="Graphics UIs" tech_domain="ui" level="apps" name="graphicsuis" contribution="contributed">
+ <collection name="svgtviewer" id="svgtviewer" long-name="SVGT Viewer" level="ui" contribution="contributed">
+ <component name="SvgtViewerPlugin" old_model="s60" old_layer="app" old_package="graphicsuis" old_collection="svgtviewer" comment="" contribution="contributed" in_production_device_rom="yes" platform_critical="no" not_used_by_s60="" path="\s60\app\graphicsuis\svgtviewer\SvgtViewerPlugin" source_size="1284454.2"/>
+ </collection>
+ </block>
+ <block long-name="Help Apps" tech_domain="ui" level="apps" name="helps" levels="empty 1 2" contribution="contributed">
+ <collection name="csxhelp" id="Csxhelp" long-name="CSX Help" level="1" contribution="contributed">
+ <component name="AiwHelpProvider" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="Csxhelp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\app\coreuiapps\Csxhelp\AiwHelpProvider" source_size="5647.8"/>
+ <component name="HelpEngine.dll=binary" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="Csxhelp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\app\coreuiapps\Csxhelp\HelpEngine.dll=binary" source_size="0.0"/>
+ <component name="cshelp.exe=binary" old_model="s60" old_layer="app" old_package="coreuiapps" old_collection="Csxhelp" comment="" contribution="contributed" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\app\coreuiapps\Csxhelp\cshelp.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="symhelp" level="2" contribution="contributed">
+ <component name="helpmodel" original-name="Help" long-name="Help" id="Help" old_model="MCL" old_layer="Generic Middleware" old_package="Generic Application Support" old_collection="Common Application Services" comment="" introduced="6.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="586759">
+ <unit bldFile="app/helps/symhelp/helpmodel/group" mrp="app/helps/symhelp/helpmodel/group/app-services_hlpmodel.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Profile" tech_domain="ui" level="apps" name="profile" levels="unused 1" contribution="contributed">
+ <collection name="profilesapplication" id="profilesapplication" long-name="Profiles Application" level="1" contribution="contributed">
+ <component name="Profiles" old_model="s60" old_layer="app" old_package="profile" old_collection="profilesapplication" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\profile\profilesapplication\Profiles" source_size="5988378.6"/>
+ </collection>
+ </block>
+ <block long-name="Speech Recognition UIs" tech_domain="ui" level="services" name="speechsrv" levels="engine framework ui" contribution="contributed">
+ <collection name="voiceui" id="voiceui" long-name="Voice UI" contribution="contributed">
+ <component name="pbkinfoview" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="voiceui" comment="" contribution="contributed"/>
+ <component name="vccontrolpanelplugin" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="voiceui" comment="" contribution="contributed"/>
+ <component name="vcommand" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="voiceui" comment="" contribution="contributed"/>
+ <component name="voiceuivoicerecognition" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="voiceui" comment="" contribution="contributed"/>
+ </collection>
+ <collection name="srsf" id="srsf" long-name="SRSF" level="framework" contribution="contributed">
+ <component name="srs" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="srsf" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\voiceservices\srsf\srs" source_size="2921661.9"/>
+ <component name="tts" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="srsf" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\voiceservices\srsf\tts" source_size="1491273.3"/>
+ <component name="vas" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="srsf" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\voiceservices\srsf\vas" source_size="2377369.8"/>
+ <component name="vuipf" old_model="s60" old_layer="app" old_package="speechsrv" old_collection="srsf" comment="" contribution="contributed" in_production_device_rom="" not_used_by_s60="" path="\s60\mw\voiceservices\srsf\vuipf" source_size="489772.8"/>
+ </collection>
+ </block>
+ <block long-name="Web UIs" tech_domain="rt" level="services" name="webuis" levels="ui app" contribution="contributed">
+ <collection name="browserui" id="browserui" long-name="Browser UI" level="app" contribution="contributed">
+ <component name="api" old_model="s60" old_layer="app" old_package="webui" old_collection="browserui" comment="" contribution="contributed"/>
+ <component name="BROWSER" old_model="s60" old_layer="app" old_package="webui" old_collection="browserui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\browserui\BROWSER" source_size="3939213.6"/>
+ <component name="CodHandler" old_model="s60" old_layer="app" old_package="webui" old_collection="browserui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\browserui\CodHandler" source_size="2336181.6"/>
+ <component name="OperatorMenu" old_model="s60" old_layer="app" old_package="webui" old_collection="browserui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\browserui\OperatorMenu" source_size="1506180.9"/>
+ <component name="VideoServices" old_model="s60" old_layer="app" old_package="webui" old_collection="browserui" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\browserui\VideoServices" source_size="244341.3"/>
+ </collection>
+ <collection name="newsticker2" id="newsticker2" long-name="News Ticker 2" level="ui" contribution="contributed">
+ <component name="AISettings" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\AISettings" source_size="27368.7"/>
+ <component name="CBCContentProviderPlugin" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\CBCContentProviderPlugin" source_size="76176.0"/>
+ <component name="FeedContentProviderPlugin" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\FeedContentProviderPlugin" source_size="30873.0"/>
+ <component name="NewsTicker_Core" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\NewsTicker_Core" source_size="1838022.3"/>
+ <component name="NT2AIDialog" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\NT2AIDialog" source_size="780377.7"/>
+ <component name="NT2AIPlugin" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\NT2AIPlugin" source_size="15834.3"/>
+ <component name="NTSHandlerApp" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\NTSHandlerApp" source_size="11422.2"/>
+ <component name="NTSHandlerDll" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\NTSHandlerDll" source_size="41587.5"/>
+ <component name="NTSHandlerRecognApp" old_model="s60" old_layer="app" old_package="webui" old_collection="newsticker2" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\newsticker2\NTSHandlerRecognApp" source_size="15037.8"/>
+ </collection>
+ <collection name="widgets" id="widgets" long-name="Widgets" level="ui" contribution="contributed">
+ <component name="WidgetApp" old_model="s60" old_layer="app" old_package="webui" old_collection="widgets" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\widgets\WidgetApp" source_size="66403.8"/>
+ <component name="WidgetInstaller" old_model="s60" old_layer="app" old_package="webui" old_collection="widgets" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="WidgetLauncher" old_model="s60" old_layer="app" old_package="webui" old_collection="widgets" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\widgets\WidgetLauncher" source_size="1671.6"/>
+ <component name="WidgetPreInstaller" old_model="s60" old_layer="app" old_package="webui" old_collection="widgets" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\widgets\WidgetPreInstaller" source_size="7255.2"/>
+ <component name="WidgetRecognizer" old_model="s60" old_layer="app" old_package="webui" old_collection="widgets" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\widgets\WidgetRecognizer" source_size="3529.5"/>
+ <component name="WidgetStartup" old_model="s60" old_layer="app" old_package="webui" old_collection="widgets" comment="" contribution="contributed" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\app\webui\widgets\WidgetStartup" source_size="5493.3"/>
+ </collection>
+ </block>
+ <block long-name="Java" tech_domain="rt" level="services" name="java" levels="plugin framework server generic" contribution="contributed" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <collection name="javaextensions" id="javaextensions" long-name="Java Extensions" level="generic" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="eswt" old_model="s60" old_layer="mw" old_package="java" old_collection="javaextensions" comment="eswt shall be in open source from day 1" contribution="excluded" source="yes" ship_license_required="no" license_status="all" license_type="commercial" copyright_holder="IBM et al" license="EPL" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javaextensions\eswt" source_size="7737254.7"/>
+ <component name="jsr" old_model="s60" old_layer="mw" old_package="java" old_collection="javaextensions" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javaextensions\jsr" source_size="35216881.2"/>
+ <component name="supplements" old_model="s60" old_layer="mw" old_package="java" old_collection="javaextensions" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial"/>
+ </collection>
+ <collection name="javainstaller" id="javainstaller" long-name="Java Installer" level="framework" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="downloadplugins" old_model="s60" old_layer="mw" old_package="java" old_collection="javainstaller" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javainstaller\downloadplugins" source_size="273224.7"/>
+ <component name="iferecognizers" old_model="s60" old_layer="mw" old_package="java" old_collection="javainstaller" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javainstaller\iferecognizers" source_size="214356.3"/>
+ <component name="installationfrontend" old_model="s60" old_layer="mw" old_package="java" old_collection="javainstaller" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javainstaller\installationfrontend" source_size="419883.6"/>
+ <component name="installplugins" old_model="s60" old_layer="mw" old_package="java" old_collection="javainstaller" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javainstaller\installplugins" source_size="1582647.3"/>
+ <component name="javarightslistener" old_model="s60" old_layer="mw" old_package="java" old_collection="javainstaller" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javainstaller\javarightslistener" source_size="286680.3"/>
+ </collection>
+ <collection name="javalegacy" id="javalegacy" long-name="Java Legacy" level="generic" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="j2me" old_model="s60" old_layer="mw" old_package="java" old_collection="javalegacy" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javalegacy\j2me" source_size="38895721.5"/>
+ <component name="JcfCommon" old_model="s60" old_layer="mw" old_package="java" old_collection="javalegacy" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javalegacy\JcfCommon" source_size="76445.7"/>
+ </collection>
+ <collection name="javamanager" id="javamanager" long-name="Java Manager" level="framework" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="javabackup" old_model="s60" old_layer="mw" old_package="java" old_collection="javamanager" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javamanager\javabackup" source_size="658198.2"/>
+ <component name="javadrmmanager" old_model="s60" old_layer="mw" old_package="java" old_collection="javamanager" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javamanager\javadrmmanager" source_size="100587.0"/>
+ <component name="javaregistry" old_model="s60" old_layer="mw" old_package="java" old_collection="javamanager" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javamanager\javaregistry" source_size="1462455.9"/>
+ <component name="javasettings" old_model="s60" old_layer="mw" old_package="java" old_collection="javamanager" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial"/>
+ </collection>
+ <collection name="javaruntime" id="javaruntime" long-name="Java Runtime" level="plugin" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="jvm" old_model="s60" old_layer="mw" old_package="java" old_collection="javaruntime" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javaruntime\jvm" source_size="28879421.4"/>
+ <component name="midp2ams" old_model="s60" old_layer="mw" old_package="java" old_collection="javaruntime" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javaruntime\midp2ams" source_size="44717.1"/>
+ <component name="redirserver" old_model="s60" old_layer="mw" old_package="java" old_collection="javaruntime" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial"/>
+ <component name="common" old_model="s60" old_layer="mw" old_package="java" old_collection="javaruntime" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial"/>
+ <component name="temp_j2me_root" old_model="s60" old_layer="mw" old_package="java" old_collection="javaruntime" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javaruntime\temp_j2me_root" source_size="203138.7"/>
+ <component name="eventserver" old_model="s60" old_layer="mw" old_package="java" old_collection="javaruntime" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javaruntime\eventserver" source_size="16004.7"/>
+ <component name="utils" old_model="s60" old_layer="mw" old_package="java" old_collection="javaruntime" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ <collection name="javautils" id="javautils" long-name="Java Utils" level="server" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="common" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ <component name="iconconverter" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javautils\iconconverter" source_size="190143.9"/>
+ <component name="integrityserver" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javautils\integrityserver" source_size="193913.1"/>
+ <component name="jarfiledecoder" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javautils\jarfiledecoder" source_size="111156.3"/>
+ <component name="javadrmutils" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javautils\javadrmutils" source_size="249366.0"/>
+ <component name="javapackagelookup" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javautils\javapackagelookup" source_size="75975.6"/>
+ <component name="javareader" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javautils\javareader" source_size="343259.7"/>
+ <component name="javarecognizer" old_model="s60" old_layer="mw" old_package="java" old_collection="javautils" comment="Java delivered only as binary with some APIs used from the native side as source." contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\mw\java\javautils\javarecognizer" source_size="2806.2"/>
+ </collection>
+ <collection name="midpprofile" original-name="MIDP 2.0 Profile" long-name="MIDP 2.0 Profile" id="MIDP 2.0 Profile" level="generic" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="midpmidlet" original-name="MIDP MIDlet" long-name="MIDP MIDlet" old_model="MCL" old_layer="Application Services" old_package="Java J2ME" old_collection="MIDP 2.0 Profile" comment="Java delivered only as binary with some APIs used from the native side as source." removed="9.5" contribution="excluded" source="no" ship_license_required="mandatory" license_status="No" license_type="commercial" not_used_by_s60="" export_restricted="no" copyright_holder="Sun Microsystems; Various Commercial and OSS" ship_license="Mandatory" partial_contribution="no" license="Sun Microsystems; Various Sun Java licenses; Apache 1.1; Motorola" in_production_device_rom="yes" platform_critical="no">
+ <unit mrp="app/java/midpprofile/midpmidlet/j2me/group/9.2/generic_j2me_92.mrp" bldFile="app/java/midpprofile/midpmidlet/j2me/systemamsV1_5"/>
+ </component>
+ </collection>
+ <collection name="midppkgs" original-name="MIDP 2.0 Packages" long-name="MIDP 2.0 Packages" id="MIDP 2.0 Packages" level="plugin" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="jtwi" original-name="JTWI 1.0" long-name="JTWI 1.0" old_model="MCL" old_layer="Application Services" old_package="Java J2ME" old_collection="MIDP 2.0 Packages" comment="Java delivered only as binary with some APIs used from the native side as source." introduced="8.0" removed="9.5" contribution="excluded" source="no" ship_license_required="mandatory" license_status="No" license_type="commercial" not_used_by_s60="" copyright_holder="Sun Microsystems" ship_license="Mandatory" partial_contribution="no" license="Sun Microsystems" in_production_device_rom="yes" platform_critical="no">
+ <unit mrp="app/java/midpprofile/midpmidlet/j2me/group/9.2/techview_j2me_92.mrp" bldFile="app/java/midpprofile/midpmidlet/j2me/group/9.2"/>
+ </component>
+ </collection>
+ <collection name="virtualmachine" original-name="Virtual Machine" long-name="Virtual Machine" id="Virtual Machine" level="plugin" contribution="excluded" source="no" ship_license_required="mandatory" license_status="open" license_type="commercial" comment="Java delivered only as binary with some APIs used from the native side as source.">
+ <component name="cldchi" original-name="CLDC Hi 1.1" long-name="CLDC Hi 1.1" old_model="MCL" old_layer="Application Services" old_package="Java J2ME" old_collection="Virtual Machine" comment="Java delivered only as binary with some APIs used from the native side as source." removed="9.5" contribution="excluded" source="no" ship_license_required="mandatory" license_status="No" license_type="commercial" not_used_by_s60="" copyright_holder="Sun Microsystems" ship_license="Mandatory" partial_contribution="no" license="Sun Microsystems" in_production_device_rom="yes" platform_critical="no">
+ <unit mrp="app/java/midpprofile/midpmidlet/j2me/group/techview_j2me_midp2.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Techview" tech_domain="ui" level="apps" span="2" name="techview" levels="services ui utils apps1 apps2" contribution="contributed">
+ <collection name="buildverification" level="services" contribution="contributed">
+ <component name="smoketest" original-name="SMOKETEST" long-name="Smoke Test" id="SMOKETEST" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="Tools and Utils" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="248070">
+ <unit bldFile="app/techview/buildverification/smoketest/Group" mrp="app/techview/buildverification/smoketest/Group/testtools_smoketest.mrp"/>
+ </component>
+ </collection>
+ <collection name="techviewplatform" original-name="Techview Platform" long-name="Techview Platform" id="Techview Platform" level="services" contribution="contributed">
+ <component name="uiklaf" original-name="UIKLAF" long-name="UIKLAF" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Techview Platform" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="207874">
+ <unit bldFile="app/techview/techviewplatform/uiklaf/GROUP" mrp="app/techview/techviewplatform/uiklaf/GROUP/techview_uiklaf.mrp" priority="10"/>
+ </component>
+ <component name="eikstd" original-name="EIKSTD" long-name="EIKSTD" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Techview Platform" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1245428">
+ <unit bldFile="app/techview/techviewplatform/eikstd/group" mrp="app/techview/techviewplatform/eikstd/group/techview_eikstd.mrp" priority="20"/>
+ </component>
+ <component name="feps" original-name="FEPS" long-name="FEPS" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Techview Platform" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="251394">
+ <unit bldFile="app/techview/techviewplatform/feps/group" mrp="app/techview/techviewplatform/feps/group/techview_feps.mrp"/>
+ </component>
+ </collection>
+ <collection name="techviewui" original-name="Techview UI" long-name="Techview UI" id="Techview UI" level="ui" contribution="contributed">
+ <component name="extras" original-name="EXTRAS" long-name="EXTRAS" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Techview UI" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="86291">
+ <unit bldFile="app/techview/techviewui/extras/group" mrp="app/techview/techviewui/extras/group/techview_extras.mrp"/>
+ </component>
+ <component name="statuspane" original-name="STATUSPANE" long-name="STATUSPANE" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Techview UI" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="81333">
+ <unit bldFile="app/techview/techviewui/statuspane/group" mrp="app/techview/techviewui/statuspane/group/techview_statuspane.mrp"/>
+ </component>
+ <component name="shell" original-name="SHELL" long-name="Shell" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Techview UI" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="346804">
+ <unit bldFile="app/techview/techviewui/shell/group" mrp="app/techview/techviewui/shell/group/techview_shell.mrp"/>
+ </component>
+ <component name="startup" original-name="STARTUP" long-name="Startup" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Techview UI" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="357747">
+ <unit bldFile="app/techview/techviewui/startup/group" mrp="app/techview/techviewui/startup/group/techview_startup.mrp"/>
+ </component>
+ </collection>
+ <collection name="sysvalidation" long-name="System Validation" id="System Test" level="services" contribution="contributed">
+ <component name="systemtestos" original-name="SYSTEMTEST_OS" long-name="System Test OS" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="System Test" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="123607377">
+ <unit mrp="app/techview/sysvalidation/systemtestos/Group/systemtest_os.mrp" bldFile="app/techview/sysvalidation/systemtestos/Group"/>
+ </component>
+ <component name="systemtesttools" original-name="SYSTEMTEST_TOOLS" long-name="System Test Tools" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="System Test" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="6541971">
+ <unit mrp="app/techview/sysvalidation/systemtesttools/Group/systemtest_tools.mrp" bldFile="app/techview/sysvalidation/systemtesttools/Group"/>
+ </component>
+ <component name="systemtestecam" original-name="System Test ECam" long-name="System Test ECam" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="System Test" comment="" class="test placeholder" introduced="9.6" contribution="contributed" in_production_device_rom="no"/>
+ <component name="systemtestupnp" original-name="System Test UPnP" long-name="System Test UPnP" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="System Test" comment="" class="test placeholder" introduced="9.6" contribution="contributed" in_production_device_rom="no"/>
+ <component name="systemtestmtpbackupandrestore" original-name="System Test MTP Backup and Restore" long-name="System Test MTP Backup and Restore" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="System Test" comment="" class="test" introduced="9.6" contribution="contributed" in_production_device_rom="no">
+ <unit bldFile="app/techview/sysvalidation/systemtestos/MTP/dataproviders/backupnrestoredp/group" mrp="app/techview/sysvalidation/systemtestos/MTP/dataproviders/backupnrestoredp/group/systemtest_mtp_backupnrestore.mrp"/>
+ </component>
+ </collection>
+ <collection name="controlpanel" original-name="Control Panel" long-name="Control Panel" id="Control Panel" level="ui" contribution="contributed">
+ <component name="fepsetup" original-name="FEPSETUP" long-name="FEP Setup" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Control Panel" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="12048">
+ <unit bldFile="app/techview/controlpanel/fepsetup/group" mrp="app/techview/controlpanel/fepsetup/group/techview_fepsetup.mrp"/>
+ </component>
+ <component name="cctlcolscheme" original-name="CCTLCOLSCHEME" long-name="Colour Scheme Control" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Control Panel" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="72209">
+ <unit bldFile="app/techview/controlpanel/cctlcolscheme/group" mrp="app/techview/controlpanel/cctlcolscheme/group/techview_cctlcolscheme.mrp"/>
+ </component>
+ <component name="soundsetup" original-name="SOUNDSETUP" long-name="Sound Setup" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Control Panel" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="92507">
+ <unit bldFile="app/techview/controlpanel/soundsetup/group" mrp="app/techview/controlpanel/soundsetup/group/techview_soundsetup.mrp"/>
+ </component>
+ <component name="keyclickref" original-name="KEYCLICKREF" long-name="Key Click Ref" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Control Panel" comment="" plugin="Y" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="7435">
+ <unit bldFile="app/techview/controlpanel/keyclickref/Group" mrp="app/techview/controlpanel/keyclickref/Group/techview_KeyClickRef.mrp"/>
+ </component>
+ </collection>
+ <collection name="pimapps" original-name="PIM Apps" long-name="PIM Apps" id="PIM Apps" level="apps2" contribution="contributed">
+ <component name="contacui" original-name="CONTACUI" long-name="Contacts UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="PIM Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="133035">
+ <unit bldFile="app/techview/pimapps/contacui/group" mrp="app/techview/pimapps/contacui/group/techview_contacui.mrp" priority="30"/>
+ </component>
+ <component name="agenda" original-name="AGENDA" long-name="Agenda UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="PIM Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="485257">
+ <unit bldFile="app/techview/pimapps/agenda/group" mrp="app/techview/pimapps/agenda/group/techview_agenda.mrp"/>
+ </component>
+ <component name="contactstechview" original-name="CONTACTS" long-name="Contacts" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="PIM Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="271431">
+ <unit bldFile="app/techview/pimapps/contactstechview/group" mrp="app/techview/pimapps/contactstechview/group/techview_contacts.mrp"/>
+ </component>
+ </collection>
+ <collection name="securityapps" original-name="Security Apps" long-name="Security Apps" id="Security Apps" level="apps2" contribution="contributed">
+ <component name="secui" original-name="SECUI" long-name="Security UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Security Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="334206">
+ <unit bldFile="app/techview/securityapps/secui/group" mrp="app/techview/securityapps/secui/group/techview_secui.mrp"/>
+ </component>
+ <component name="securityupstechview" original-name="Security UPS Techview" long-name="Security UPS Techview" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Security Apps" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="27113">
+ <unit bldFile="os/unref/orphan/comgen/security/ups/techview/group" mrp="os/unref/orphan/comgen/security/ups/techview/group/security_ups_techview.mrp"/>
+ </component>
+ </collection>
+ <collection name="utilityapps" original-name="Utility Apps" long-name="Utility Apps" id="Utility Apps" level="apps2" contribution="contributed">
+ <component name="helptechview" original-name="HELP" long-name="Help" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Utility Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="190021">
+ <unit bldFile="app/techview/utilityapps/helptechview/group" mrp="app/techview/utilityapps/helptechview/group/techview_help.mrp"/>
+ </component>
+ <component name="timew" original-name="TIMEW" long-name="World Time" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Utility Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="191860">
+ <unit bldFile="app/techview/utilityapps/timew/group" mrp="app/techview/utilityapps/timew/group/techview_timew.mrp"/>
+ </component>
+ </collection>
+ <collection name="installationapps" original-name="Installation Apps" long-name="Installation Apps" id="Installation Apps" level="apps1" contribution="contributed">
+ <component name="installapp" original-name="Install App" long-name="Install App" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Installation Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="1251715">
+ <unit bldFile="app/techview/installationapps/installapp/group" mrp="app/techview/installationapps/installapp/group/techview_installapp.mrp"/>
+ </component>
+ </collection>
+ <collection name="messagingapps" original-name="Messaging Apps" long-name="Messaging Apps" id="Messaging Apps" level="apps1" contribution="contributed">
+ <component name="messagingui" original-name="MESSAGINGUI" long-name="Messaging UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Messaging Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="2012899">
+ <unit bldFile="app/techview/messagingapps/messagingui/Group" mrp="app/techview/messagingapps/messagingui/Group/techview_messagingui.mrp"/>
+ </component>
+ </collection>
+ <collection name="telephonyapps" original-name="Telephony Apps" long-name="Telephony Apps" id="Telephony Apps" level="apps1" contribution="contributed">
+ <component name="phoneui" original-name="PHONEUI" long-name="PHONEUI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Telephony Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="152126">
+ <unit bldFile="app/techview/telephonyapps/phoneui/group" mrp="app/techview/telephonyapps/phoneui/group/techview_phoneui.mrp"/>
+ </component>
+ </collection>
+ <collection name="networkingapps" original-name="Networking Apps" long-name="Networking Apps" id="Networking Apps" level="apps1" contribution="contributed">
+ <component name="iapstatusapp" original-name="IAPSTATUSAPP" long-name="IAP Status App" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Networking Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="81361">
+ <unit bldFile="app/techview/networkingapps/iapstatusapp/group" mrp="app/techview/networkingapps/iapstatusapp/group/techview_iapstatusapp.mrp"/>
+ </component>
+ <component name="networkingagentnotifier" original-name="Networking Agent Notifier" long-name="Networking Agent Notifier" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Networking Apps" comment="" plugin="Y" introduced="7.0s" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="8997">
+ <unit bldFile="app/techview/networkingapps/networkingagentnotifier/group" mrp="app/techview/networkingapps/networkingagentnotifier/group/techview_networking_agentnotifier.mrp"/>
+ </component>
+ <component name="vpnui" original-name="VPN UI" long-name="VPN UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Networking Apps" comment="" introduced="7.0" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="126117">
+ <unit bldFile="app/techview/networkingapps/vpnui/group" mrp="app/techview/networkingapps/vpnui/group/techview_networking_vpnui.mrp"/>
+ </component>
+ <component name="wpsconnect" original-name="WPS Connect" long-name="WPS Connect" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Networking Apps" comment="" introduced="9.5" contribution="contributed" in_production_device_rom="no" source_size="153805">
+ <unit bldFile="os/unref/orphan/comtv/commsui/wpsconnect/group" mrp="os/unref/orphan/comtv/commsui/wpsconnect/group/techview_wpsconnect.mrp"/>
+ </component>
+ </collection>
+ <collection name="networkingutils" original-name="Networking Utils" long-name="Networking Utils" id="Networking Utils" level="utils" contribution="contributed">
+ <component name="ipadministrationtool" original-name="IP Administration Tool" long-name="IP Administration Tool" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Networking Utils" comment="" class="test" introduced="7.0" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="20755">
+ <unit mrp="app/techview/networkingutils/ipadministrationtool/group/networking_ipadm.mrp"/>
+ </component>
+ <component name="nameresolverutility" original-name="Name Resolver Utility" long-name="Name Resolver Utility" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Networking Utils" comment="" class="test" introduced="7.0s" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="21133">
+ <unit mrp="app/techview/networkingutils/nameresolverutility/group/networking_nslookup.mrp"/>
+ </component>
+ </collection>
+ <collection name="datasyncapps" original-name="Data Sync Applications" long-name="Data Sync Applications" id="Data Sync Applications" level="apps2" contribution="contributed">
+ <component name="syncmlapp" original-name="SYNCMLAPP" long-name="SyncML App" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Data Sync Applications" comment="" deprecated="9.5" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="363275">
+ <unit bldFile="app/techview/datasyncapps/syncmlapp/group" mrp="app/techview/datasyncapps/syncmlapp/group/techview_syncmlapp.mrp"/>
+ </component>
+ </collection>
+ <collection name="shortlinkapps" original-name="Shortlink Apps" long-name="Shortlink Apps" id="Shortlink Apps" level="apps1" contribution="contributed">
+ <component name="usbui" original-name="USBUI" long-name="USB UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Shortlink Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="56840">
+ <unit bldFile="app/techview/shortlinkapps/usbui/group" mrp="app/techview/shortlinkapps/usbui/group/techview_usbui.mrp"/>
+ </component>
+ <component name="bluetoothui" original-name="Bluetooth UI" long-name="Bluetooth UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Shortlink Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="293922">
+ <unit bldFile="app/techview/shortlinkapps/bluetoothui/group" mrp="app/techview/shortlinkapps/bluetoothui/group/techview_bluetoothui.mrp"/>
+ </component>
+ <component name="connectui" original-name="CONNECTUI" long-name="CONNECTUI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Shortlink Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="15138">
+ <unit bldFile="app/techview/shortlinkapps/connectui/group" mrp="app/techview/shortlinkapps/connectui/group/techview_connectui.mrp"/>
+ </component>
+ </collection>
+ <collection name="connectivityapps" original-name="Connectivity Apps" long-name="Connectivity Apps" id="Connectivity Apps" level="utils" contribution="contributed">
+ <component name="connectivityfw" original-name="Connectivity Framework" long-name="Connectivity Framework" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Connectivity Apps" comment="" introduced="7.0s" deprecated="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="1383914">
+ <unit bldFile="app/techview/connectivityapps/connectivityfw/group" mrp="app/techview/connectivityapps/connectivityfw/group/connectivity_framework.mrp"/>
+ </component>
+ <component name="connectivityservices" original-name="Connectivity Services" long-name="Connectivity Services" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Connectivity Apps" comment="" introduced="7.0s" deprecated="9.4" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="yes" platform_critical="no" source_size="626117">
+ <unit bldFile="app/techview/connectivityapps/connectivityservices/group" mrp="app/techview/connectivityapps/connectivityservices/group/connectivity_services.mrp"/>
+ </component>
+ </collection>
+ <collection name="accessoryplugins" original-name="Accessory Plugins" long-name="Accessory Plugins" id="Accessory Plugins" level="utils" contribution="contributed">
+ <component name="reftsp" original-name="Remote Control Reference TSP" long-name="Remote Control Reference TSP" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Accessory Plugins" comment="" plugin="Y" introduced="9.1" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="18416">
+ <unit bldFile="app/techview/accessoryplugins/reftsp/group" mrp="app/techview/accessoryplugins/reftsp/group/bluetooth_remotecontrol_refTSP.mrp"/>
+ </component>
+ </collection>
+ <collection name="testapps" original-name="Test Apps" long-name="Test Apps" id="Test Apps" level="utils" contribution="contributed">
+ <component name="simpleapp" original-name="Simple App" long-name="Simple App" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Test Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="30834">
+ <unit bldFile="app/techview/testapps/simpleapp/group" mrp="app/techview/testapps/simpleapp/group/Techview_SimpleApp.mrp"/>
+ </component>
+ <component name="statdevice" original-name="STAT_DEVICE" long-name="STAT Device" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Test Apps" comment="" contribution="contributed" not_used_by_s60="yes" in_production_device_rom="no" platform_critical="no" source_size="0">
+ <unit bldFile="os/unref/comtt/stat/device/source/statapi/Techview" mrp="os/unref/comtt/stat/device/group/testtools_stat_device_techview.mrp"/>
+ </component>
+ <component name="rschandlerui" original-name="RESOURCE_HANDLER_UI" long-name="Resource Handler" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Test Apps" comment="" contribution="contributed" not_used_by_s60="yes" in_production_device_rom="no" platform_critical="no" source_size="0">
+ <unit bldFile="app/techview/testapps/rschandler/TVResourceHandler/group" mrp="app/techview/testapps/rschandler/TVResourceHandler/group/Testtools_ResourceHandler_techview.mrp"/>
+ </component>
+ <component name="graphicstestutils" original-name="Graphics Test Utils" long-name="Graphics Test Utils" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Test Apps" comment="" class="test" introduced="9.2" contribution="contributed" in_production_device_rom="no">
+ <unit bldFile="os/unref/orphan/comgen/graphics/testutils/group" mrp="os/unref/orphan/comgen/graphics/testutils/group/graphics_testutils.mrp"/>
+ </component>
+ <component name="rschandler" original-name="RESOURCE_HANDLER" long-name="Resource Handler UI" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Test Apps" comment="" deprecated="9.5" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="65473">
+ <unit mrp="app/techview/testapps/rschandler/TVResourceHandler/group/Testtools_ResourceHandler_gt.mrp"/>
+ </component>
+ </collection>
+ <collection name="avapps" id="V Apps" long-name="A/V Apps" level="apps2" contribution="contributed">
+ <component name="audio" original-name="AUDIO" long-name="Audio" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="V Apps" comment="" contribution="contributed" not_used_by_s60="yes" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="259700">
+ <unit bldFile="app/techview/avapps/audio/Group" mrp="app/techview/avapps/audio/Group/techview_audio.mrp"/>
+ </component>
+ </collection>
+ <collection name="toolkit" original-name="Toolkit" long-name="Toolkit" id="Toolkit" level="utils" contribution="contributed">
+ <component name="romkit" original-name="ROM Kit" long-name="ROM Kit" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Toolkit" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="7393">
+ <unit bldFile="app/techview/toolkit/romkit/group" mrp="app/techview/toolkit/romkit/group/techview_romkit.mrp"/>
+ </component>
+ <component name="romimages" original-name="ROM Images" long-name="ROM Images" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Toolkit" comment="" contribution="contributed" not_used_by_s60="" in_production_device_rom="no" platform_critical="no" source_size="0">
+ <unit version="Future" mrp="os/buildtools/buildinfrastructure/cedarutils/reference_roms_Future.mrp"/>
+ <unit version="9.5" mrp="os/buildtools/buildinfrastructure/cedarutils/reference_roms_9.5.mrp"/>
+ <unit version="9.6" mrp="os/buildtools/buildinfrastructure/cedarutils/reference_roms_9.6.mrp"/>
+ <unit mrp="os/buildtools/buildinfrastructure/cedarutils/techview_roms_9.4.mrp" version="9.4"/>
+ </component>
+ <component name="configurationfiles" original-name="Configuration Files" long-name="Configuration Files" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Toolkit" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="335">
+ <unit mrp="app/techview/toolkit/configurationfiles/techview_epoc_ini.mrp"/>
+ </component>
+ <component name="additionalconfigurationfiles" original-name="Additional Configuration Files" long-name="Additional Configuration Files" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Toolkit" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="2180">
+ <unit mrp="app/techview/toolkit/configurationfiles/techview_additional_cedar.mrp"/>
+ </component>
+ <component name="cdborphans" original-name="CDB Orphaned Header file checker" long-name="CDB Orphan File Handler" old_model="MCL" old_layer="Applications" old_package="Techview" old_collection="Toolkit" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="23942">
+ <unit bldFile="os/unref/orphan/comtv/apps/CDBDummy/group" mrp="os/unref/orphan/comtv/apps/CDBDummy/group/techview_cdb_dummy_orphanheader_checker.mrp"/>
+ </component>
+ </collection>
+ </block>
+ <block long-name="Conn Tools" tech_domain="to" level="apps" span="2" name="conntools" levels="1 2" contribution="contributed">
+ <collection name="nettools" id="ConnTest" long-name="Net Tools" level="2" contribution="contributed">
+ <component name="probe" old_model="s60" old_layer="tools" old_package="nettools" old_collection="ConnTest" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\nettools\ConnTest\probe" source_size="6135.0"/>
+ <component name="ConnTest.exe=binary" old_model="s60" old_layer="tools" old_package="nettools" old_collection="ConnTest" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\nettools\ConnTest\ConnTest.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="emulatorlan" id="emulatorlan" long-name="Emulator Lan" level="1" contribution="contributed">
+ <component name="emulatorlan compo" old_model="s60" old_layer="tools" old_package="nettools" old_collection="emulatorlan" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="" not_used_by_s60="" path="\s60\tools\nettools\emulatorlan\emulatorlan compo" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="SW Configuration Tools" tech_domain="to" level="apps" span="2" name="swconfigtools" contribution="contributed" levels="0 1 2 cmd-line GUI">
+ <collection name="gid_pc_tool" id="gid_pc_tool" long-name="GID PC Tool" contribution="contributed">
+ <component name="DBImporter" old_model="s60" old_layer="tools" old_package="systemswtools" old_collection="gid_pc_tool" comment="" contribution="contributed" in_production_device_rom="no" platform_critical="no" not_used_by_s60="" path="\s60\tools\systemswtools\gid_pc_tool\DBImporter" source_size="13010.1"/>
+ </collection>
+ <collection name="Designers" level="GUI">
+ <component name="Variant Toolkit" impl_language="perl" desktop="yes" prototype="true" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="System Model Tools" level="GUI">
+ <component name="System Model Toolkit UI" desktop="yes" source="yes" partial_contribution="no" license_type="OSS" license_status="no" license="Apache 2 (http://vmgump.apache.org/gump/public/cglib/cglib-nodep/index.html); Common Public License (http://emma.sourceforge.net/); Apache v2 (Log4J); EPL (JUnit; Eclipse re-distribution); http://www.jmock.org/license.html" impl_language="java.eclipse" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Config Tools Guides" level="GUI">
+ <component name="System Model Manager Guide" impl_language="data" desktop="yes" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/product/tools/smg/gui/group" mrp="tools/product/tools/smg/gui/group/system_model_manager.mrp"/>
+ </component>
+ <component name="SDB Creation Tool Guide" desktop="yes" impl_language="data" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Data Engines" level="cmd-line">
+ <component name="System Model Toolkit" desktop="yes" source="yes" partial_contribution="no" license_status="no" license="Apache v2 (http://xml.apache.org/xalan-j/)" license_type="OSS" comment="contains Xalan as part of the distribution" impl_language="perl" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="System Model Schemas" level="cmd-line">
+ <component name="System Model XSL..." impl_language="data" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="System Models..." impl_language="data" desktop="yes" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Versit File Converters" level="1">
+ <component name="VCard 2 SQL" impl_language="java" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Settings Engines" level="1">
+ <component name="SQLite DB creator" desktop="yes" source="yes" partial_contribution="no" license_status="no" license="Apache 2 (http://vmgump.apache.org/gump/public/cglib/cglib-nodep/index.html); Common Public License (http://emma.sourceforge.net/); http://www.jmock.org/license.html; Public Domain (http://www.sqlite.org/); Apache v2 (Log4J); JUnit" license_type="OSS" comment="Log4J and JUnit should be broken out of this component as covered elsewhere" impl_language="java" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Cenrep creator" impl_language="java" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="DBMS creator" impl_language="java" desktop="yes" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Default Comms DB" desktop="yes" mcl_component="Prepare Default Comms Database" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes">
+ <unit root="MCL" bldFile="os/commsfw/commsconfigutils/commsdatabase/defaultcommdb/group" mrp="os/commsfw/commsconfigutils/commsdatabase/defaultcommdb/group/comms-infras_defaultcommdb.mrp"/>
+ </component>
+ <component name="Comms DB Install Default" desktop="yes" mcl_component="Install Default Comms Database" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="yes">
+ <unit root="MCL" bldFile="os/commsfw/commsconfigutils/commsdatabase/installdefaultcommdb/group" mrp="os/commsfw/commsconfigutils/commsdatabase/installdefaultcommdb/group/comms-infras_installdefaultcommdb.mrp" priority="1010"/>
+ </component>
+ <component name="Comms DB tools" mcl_component="Comms Tools" impl_language="os.c.c++" introduced="Saffron" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="app/swconfigtools/settingsengines/commsdbtools/group/comms-infras_tools.mrp"/>
+ </component>
+ </collection>
+ <collection name="Software Libraries" level="0">
+ <component name="E32 and F32 Port" impl_language="os.c.c++" codeline="mcl" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="Store and CenRep Port" impl_language="os.c.c++" codeline="mcl" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="ConfigurationTool">
+ <component name="ConfigurationTool compo" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="ConfigurationTool" license="S60 OEM R&D" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools" platform_critical="" not_used_by_s60="" path="\s60\tools\toolsextensions\ConfigurationTool\ConfigurationTool compo" source_size="0.0"/>
+ </collection>
+ <collection name="Carbide.v">
+ <component name="Carbide.v" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="Carbide.v" source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ </block>
+ <block tech_domain="to" level="apps" span="2" name="SDK" contribution="contributed" levels="0 1 2 3 GUI">
+ <collection name="devlib" original-name="Developer Library" long-name="Developer Library" id="Developer Library" level="GUI" contribution="contributed">
+ <component name="systemdocs" original-name="System Documentation" long-name="System Documentation" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="Developer Library" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="41633655">
+ <unit mrp="app/sdk/devlib/systemdocs/group/system.mrp"/>
+ </component>
+ <component name="toolsdocs" original-name="Tools Documentation" long-name="Tools Documentation" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="Developer Library" comment="" class="doc" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="3835340">
+ <unit mrp="app/sdk/devlib/toolsdocs/tools_documentation.mrp"/>
+ </component>
+ </collection>
+ <collection name="misccomponents" id="SDKENG" long-name="Misc Components" level="3" contribution="contributed">
+ <component name="sdkinfo" original-name="SDKINFO" long-name="SDK Info" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="SDKENG" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="22497">
+ <unit bldFile="app/sdk/misccomponents/sdkinfo/group" mrp="app/sdk/misccomponents/sdkinfo/group/tools_sdk_eng_sdkinfo.mrp"/>
+ </component>
+ <component name="devkitpackagedefs" original-name="DevKit Package Defs" long-name="DevKit Package Defs" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="SDKENG" comment="" removed="9.5" contribution="contributed" in_production_device_rom="no">
+ <unit mrp="/product/DevKit/product_devkit_pkgdefs.mrp"/>
+ </component>
+ <component name="sdkpkgtools" original-name="SDKPKG-TOOLS" long-name="SDK Package Manager Utilities" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="SDKENG" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="355365">
+ <unit bldFile="app/sdk/misccomponents/sdkpkgtools/group" mrp="app/sdk/misccomponents/sdkpkgtools/group/tools_sdk_eng_sdkpkg-tools.mrp"/>
+ </component>
+ <component name="CWPLUGINS" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="SDKENG" comment="" removed="9.5" contribution="contributed" in_production_device_rom="no">
+ <unit mrp="app/sdk/misccomponents/cwplugins/group/tools_sdk_eng_cwplugins.mrp" bldFile="app/sdk/misccomponents/cwplugins/group"/>
+ </component>
+ <component name="bspbuilder" original-name="BSPBUILDER" long-name="BSP Builder" old_model="MCL" old_layer="Tools and Utils and SDKENG" old_package="System Build and Test" old_collection="SDKENG" comment="" contribution="contributed" not_used_by_s60="" export_restricted="no" in_production_device_rom="no" platform_critical="no" source_size="7517">
+ <unit bldFile="app/sdk/misccomponents/bspbuilder/group" mrp="app/sdk/misccomponents/bspbuilder/group/tools_bspbuilder.mrp"/>
+ </component>
+ </collection>
+ <collection name="Redistribution" level="1">
+ <component name="WinC" desktop="yes" mcl_component="WinC Redistribution" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="app/sdk/redistribution/winc/tools_redistribution_winc.mrp"/>
+ </component>
+ <component name="WinC EKA2" desktop="yes" mcl_component="REDISTRIBUTION_WINC_EKA2" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="app/sdk/redistribution/winc" mrp="app/sdk/redistribution/winc/tools_redistribution_cedar.mrp"/>
+ </component>
+ <component name="Additional" desktop="yes" license_type="commercial" source="no" partial_contribution="no" license_status="no" license="Misc" copyright_holder="Misc OSS and Commercial" comment="Misc 3rd party binaries re-distributed in SDKs; CustKits; etc." mcl_component="Additional Redistribution" impl_language="c.c++" codeline="mcl" plugin="no" old_model="TCL" in_production_device_rom="no" platform_critical="no" contribution="excluded">
+ <unit root="MCL" mrp="os/buildtools/perltoolsplatform/perl/additional_tools.mrp"/>
+ </component>
+ </collection>
+ <collection name="SITK product assets" level="GUI">
+ <component name="SITK Installer" desktop="yes" impl_language="java.eclipse" plugin="no" old_model="TCL" contribution="contributed"/>
+ <component name="SITK Workbench" desktop="yes" source="yes" partial_contribution="yes" license_type="commercial" license_status="Open" license="EPLv1 (http://www.eclipse.org/datatools/); Apache v2 (http://ant.apache.org/; http://commons.apache.org/net/; http://lucene.apache.org); Apache v1.1; v2; Common Public License (http://xerces.apache.org/); EPL v1; Common Public License (www.eclipse.com re-distribution); Apache v1.1; EPL v1; MX4J license (http://tomcat.apache.org/); EPL v1.0 (JUNIT); IBM (org.eclipse.help.webapp*) - should really be EPL but blackduck" comment="SITK code itself contains mainly forensic matches and GIFs. Various re-distribution of 3rd party code in /tools/sitk/workbench/shared" impl_language="java.eclipse" plugin="no" old_model="TCL" contribution="partial">
+ <unit root="TCL" bldFile="tools/product/tools/sitk/workbench/group" mrp="tools/product/tools/sitk/workbench/group/tools_sitk_workbench.mrp"/>
+ </component>
+ <component name="EPOC Management" desktop="yes" impl_language="java.eclipse" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/product/tools/sitk/epoc_preferences/group" mrp="tools/product/tools/sitk/epoc_preferences/group/tools_epoc_management.mrp"/>
+ </component>
+ <component name="SVS RS Settings" desktop="yes" impl_language="java.eclipse" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/product/tools/sitk/svsresponseserver_settings/group" mrp="tools/product/tools/sitk/svsresponseserver_settings/group/tool_dtn_settings.mrp"/>
+ </component>
+ </collection>
+ <collection name="SITK Guides" level="GUI">
+ <component name="SITK Workbench Guide" desktop="yes" license="contains UIQ SDK 3.1 (UIQ icons)" impl_language="data" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/documentation/sitk/group/intro" mrp="tools/documentation/sitk/group/intro/tools_workbench_doc.mrp"/>
+ </component>
+ <component name="CBR Guide" desktop="yes" license="contains UIQ SDK 3.1 (UIQ icons)" impl_language="data" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/documentation/sitk/group/cbr" mrp="tools/documentation/sitk/group/cbr/tools_cbr_doc.mrp"/>
+ </component>
+ </collection>
+ <collection name="SVS Guides" level="GUI">
+ <component name="SVS Guide" desktop="yes" license="contains UIQ SDK 3.1 (UIQ icons)" impl_language="data" codeline="tcl" filter="dp.doc" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/documentation/sitk/group/svs" mrp="tools/documentation/sitk/group/svs/tools_svs_doc.mrp"/>
+ </component>
+ </collection>
+ <collection name="Packaging" level="3">
+ <component name="CBR Infrastructure" desktop="yes" not_used_by_s60="yes" comment="Enables CBR builds" impl_language="data" mcl_component="DUMMY;Additional Utils" codeline="mcl" infra="true" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="yes" platform_critical="no">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/cbr/dummy" mrp="os/unref/comgen/tools/cbr/dummy/additional_dummy.mrp"/>
+ <unit root="MCL" mrp="os/deviceplatformrelease/gtbaseline/gttechviewbaseline/additional_unknown_cedar.mrp"/>
+ </component>
+ <component name="CBR Tools" desktop="yes" source="yes" partial_contribution="yes" license_type="commercial" comment="Contains /tools/cbr/perl/Net/libnetFAQ.pod (ActiveState) which is commercial" license_status="no" license="Perl Artistic License; GPLv2 (various Perl libraries; e.g. Archive-Tar; Archive-Zip; MLDBM; in dp/master/product/tools/cbr/perl/); zlib/libpng License (http://www.opensource.org/licenses/zlib-license.php); ActiveState Community License; GPL like (http://www.apachefriends.org/en/xampp.html)" mcl_component="CBRTOOLS" impl_language="perl" plugin="no" old_model="TCL" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Various OSS" ship_license="No" contribution="partial">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/cbr/tools/group" mrp="os/unref/comgen/tools/cbr/tools/group/tools_cbr_tools.mrp"/>
+ <unit root="TCL" bldFile="tools/product/tools/cbr/group" mrp="tools/product/tools/cbr/group/tools_cbr.mrp"/>
+ </component>
+ </collection>
+ <collection name="Kit Creation" level="3">
+ <component name="Generic Kit Maker" desktop="yes" mcl_component="CBRPRF" not_used_by_s60="yes" comment="Used to create custkits in CBR form" impl_language="java" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="app/sdk/kitcreation/generickitmaker/group" mrp="app/sdk/kitcreation/generickitmaker/group/tools_cbr_prf.mrp"/>
+ </component>
+ <component name="SDK Runtime" desktop="yes" mcl_component="RUNPERL;EMULATOR_LAUNCHER;TOOLS_STUBS" comment="Utilities to execute and manage SDKs" impl_language="java" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/runperl/group" mrp="os/unref/comgen/tools/sdk_eng/runperl/group/tools_sdk_eng_runperl.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/emulator_launcher/group" mrp="os/unref/comgen/tools/sdk_eng/emulator_launcher/group/tools_sdk_eng_emulator_launcher.mrp"/>
+ <unit root="MCL" bldFile="app/sdk/kitcreation/sdkruntime/group" mrp="app/sdk/kitcreation/sdkruntime/group/tools_sdk_eng_tools_stubs.mrp"/>
+ </component>
+ <component name="SDK Maker" desktop="yes" mcl_component="SDK Builder;SDK Package Manager;PKGMGRGUI;KITSETUPAPP" comment="Tools to create SDKs (including examples)" impl_language="java" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" license="Apache 2.0; OSS Unknown; GPL 2.0; LGPL 2.1" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/SDK_Builder/group" mrp="os/unref/comgen/tools/sdk_eng/SDK_Builder/group/tools_sdk_eng_sdk_builder.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/sdkpkg-manager/group" mrp="os/unref/comgen/tools/sdk_eng/sdkpkg-manager/group/tools_sdk_eng_sdkpkg-manager.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/pkgmgrgui/group" mrp="os/unref/comgen/tools/sdk_eng/pkgmgrgui/group/tools_sdk_eng_pkgmgrgui.mrp"/>
+ <unit root="MCL" bldFile="app/sdk/kitcreation/sdkmaker/group" mrp="app/sdk/kitcreation/sdkmaker/group/tools_devkits_kitsetupapp.mrp" priority="1020"/>
+ </component>
+ <component name="DevKit Runtime" desktop="yes" comment="Installer and navigation for DevKits" mcl_component="NAVIGATION_PAGES;PRODUCTINSTALLER" not_used_by_s60="yes" impl_language="java" codeline="mcl" plugin="no" old_model="TCL" contribution="contributed" export_restricted="no" in_production_device_rom="no" platform_critical="no">
+ <unit root="MCL" mrp="os/unref/comgen/tools/sdk_eng/NavigationPages/tools_sdk_eng_NavigationPages.mrp"/>
+ <unit root="MCL" bldFile="app/sdk/kitcreation/devkitruntime/group" mrp="app/sdk/kitcreation/devkitruntime/group/tools_custkits_productinstaller.mrp"/>
+ </component>
+ <component name="DevKit Maker" desktop="yes" mcl_component="ASSERTION;ENUM;LOGGER;FILESYS;ENVVAR;INSTALLUTILS;MNEMONICFIX;PATHBROWSER;SHELLEXEC;SWINGWORKER;TESTCASERUNNER;TOOLBARPANEL;JAVAHELP;LANGCONFIG;JADE;Example Package Defs" comment="Tools used to build Symbian DevKits" not_used_by_s60="yes" impl_language="java" codeline="mcl" plugin="no" old_model="TCL" contribution="available" export_restricted="no" in_production_device_rom="no" platform_critical="no" copyright_holder="Jean-Marie Dautelle" license_status="No" ship_license="No" source="yes" license="Jean-Marie Dautelle" license_type="OSS" partial_contribution="">
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/assertion/group" mrp="os/unref/comgen/tools/sdk_eng/assertion/group/tools_sdk_eng_assertion.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/enum/group" mrp="os/unref/comgen/tools/sdk_eng/enum/group/tools_sdk_eng_enum.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/logger/group" mrp="os/unref/comgen/tools/sdk_eng/logger/group/tools_sdk_eng_logger.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/filesys/group" mrp="os/unref/comgen/tools/sdk_eng/filesys/group/tools_sdk_eng_filesys.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/envvar/group" mrp="os/unref/comgen/tools/sdk_eng/envvar/group/tools_sdk_eng_envvar.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/installutils/group" mrp="os/unref/comgen/tools/sdk_eng/installutils/group/tools_sdk_eng_installutils.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/mnemonicfix/group" mrp="os/unref/comgen/tools/sdk_eng/mnemonicfix/group/tools_sdk_eng_mnemonicfix.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/pathbrowser/group" mrp="os/unref/comgen/tools/sdk_eng/pathbrowser/group/tools_sdk_eng_pathbrowser.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/shellexec/group" mrp="os/unref/comgen/tools/sdk_eng/shellexec/group/tools_sdk_eng_shellexec.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/swingworker/group" mrp="os/unref/comgen/tools/sdk_eng/swingworker/group/tools_sdk_eng_swingworker.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/testcaserunner/group" mrp="os/unref/comgen/tools/sdk_eng/testcaserunner/group/tools_sdk_eng_testcaserunner.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/toolbarpanel/group" mrp="os/unref/comgen/tools/sdk_eng/toolbarpanel/group/tools_sdk_eng_toolbarpanel.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/javahelp/group" mrp="os/unref/comgen/tools/sdk_eng/javahelp/group/tools_sdk_eng_javahelp.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/langconfig/group" mrp="os/unref/comgen/tools/sdk_eng/langconfig/group/tools_sdk_eng_langconfig.mrp"/>
+ <unit root="MCL" bldFile="os/unref/comgen/tools/sdk_eng/jade/group" mrp="os/unref/comgen/tools/sdk_eng/jade/group/tools_sdk_eng_jade.mrp"/>
+ <unit root="MCL" mrp="/product/TechviewExampleSDK/product_TechViewExampleSDK_pkgdefs.mrp"/>
+ </component>
+ <component name="SITK Maker" desktop="yes" not_used_by_s60="yes" source="yes" partial_contribution="no" license_type="OSS" license_status="no" license="Apache 2 (http://vmgump.apache.org/gump/public/cglib/cglib-nodep/index.html); Common Public License (http://emma.sourceforge.net/); http://www.jmock.org/license.html; Apache v2 (http://ant.apache.org/); Apache v2 (Log4J); JUnit" comment="Used to create the SITK and SAW from CBR archives. Depends on CBR Tools. SITK depends on this tool." impl_language="java" infra="true" plugin="no" old_model="TCL" contribution="contributed">
+ <unit root="TCL" bldFile="tools/product/tools/sitk/maker/group" mrp="tools/product/tools/sitk/maker/group/product_tools_sitk_maker.mrp"/>
+ </component>
+ </collection>
+ <collection name="Build Analysis" level="2">
+ <component name="evalid" original-name="EVALID" long-name="Evalid" desktop="yes" mcl_component="EVALID" comment="Used by CBR to compare two builds" impl_language="perl" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="contributed" in_production_device_rom="no" platform_critical="no" source_size="1127562"/>
+ </collection>
+ <collection name="SDK Delivery" level="1">
+ <component name="ExamplesCPP" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="ExamplesJava" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="ExamplesWidget" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="S60 SDKDocumentation" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Symbian Documentation" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="Symbian" source="no" license_status="OK" desktop="yes" foundation="yes" contribution="excluded" old_model="S60Tools"/>
+ <component name="SVGtoSVGTConverter" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60" source="no" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="excluded" old_model="S60Tools"/>
+ <component name="SimPsyConfigurator" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60" source="no" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="excluded" old_model="S60Tools"/>
+ <component name="MBMViewer" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60" source="no" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="excluded" old_model="S60Tools"/>
+ <component name="Plug-ins" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60" source="no" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="excluded" old_model="S60Tools"/>
+ </collection>
+ <collection name="SDK Creation" level="2">
+ <component name="BuildScripts" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="SDK Patches" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Scripts(Packaging)" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="SDK Installer" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="MacroVision" source="no" ship_license_required="yes" copyright_holder="Macrovision" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" old_model="S60Tools"/>
+ <component name="APIRefGen" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="MIDP Wrappers" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="SDK Registration" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="SDKDiagnostics" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="ECMTManager" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="ECMTServer" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="XRPC" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Winsock" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 " source="no" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="excluded" old_model="S60Tools"/>
+ <component name="MsgRelay" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="epdt_java" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="SDK stubs" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Fileloader" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Scards" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Npacket" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="MIDPODD" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDk " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ <collection name="SDK Test" level="GUI">
+ <component name="Classwalker" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="no" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="excluded" old_model="S60Tools"/>
+ <component name="SDKtf.testrunner" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="S60 SDK " source="yes" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="Linklint" comment="third party tool" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="GPL" source="no" ship_license_required="yes" copyright_holder="Open" license_status="NOK" desktop="yes" foundation="yes" license_type="OSS" contribution="available" old_model="S60Tools"/>
+ <component name="TCKTestSuite" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="SDK" license="Vendor(Sun, IBM, Motorola, Nokia, Siemens etc)" source="no" ship_license_required="yes" copyright_holder="Various" license_status="NOK" desktop="yes" foundation="yes" license_type="commercial" contribution="excluded" comment="Vendor provided test suites, not owned by SDK team, used for testing JSRs in the SDK" old_model="S60Tools"/>
+ </collection>
+ <collection name="Carbide.c++ Plugin" level="GUI">
+ <component name="com.nokia.cdt.templates.n_gag" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.s60.s60sdkdoc_3.0_mr" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.s60.sdk.carbide_3.2" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.s60.sdj,exaoo_3.2" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ <component name="com.nokia.s60.tui.sdk_1.0.0" tech_domain="to" old_layer="os" old_domain="Development Tools" old_subsystem="IDE" license="Nokia" source="yes" ship_license_required="open" copyright_holder="Nokia" license_status="OK" desktop="yes" foundation="yes" contribution="contributed" old_model="S60Tools"/>
+ </collection>
+ </block>
+ <block name="System Documentation" levels="0 1 2 3 GUI" tech_domain="to" long-name="System Docs" level="apps" span="2" contribution="contributed">
+ <collection name="System Wide Content" level="GUI">
+ <component name="devlibsrc" original-name="Developer Library Source" long-name="Developer Library Source" desktop="yes" mcl_component="Developer Library Source" impl_language="data" codeline="mcl" plugin="no" old_model="TCL" not_used_by_s60="" export_restricted="no" contribution="available" license_type="OSS" copyright_holder="Various OSS" license_status="No" ship_license="No" source="yes" partial_contribution="" license="Python; Apache; GPL 2.0; Perl Artistic; Various Java; Various OSS (Unknown)" in_production_device_rom="no" platform_critical="no" source_size="210702250"> <unit bldFile="app/systemdocumentation/generated/devlib_htmld_/securitysupplement/doc_source" mrp="app/systemdocumentation/generated/devlib_htmld_/developerlibrary_doc_source.mrp"/>
+ </component>
+ </collection>
+ <collection name="Developer Library Build" level="2">
+ <component name="DevLib Build" desktop="yes" source="yes" partial_contribution="yes" license="Apache 1.1 (Apache XML Xalan-Java); GPL 2.0 (XML Builder lib)" license_type="OSS" comment="OSS nicely separated in source tree" mcl_component="Developer Library Tools" impl_language="python" codeline="mcl" plugin="no" old_model="TCL" in_production_device_rom="no" platform_critical="no" contribution="partial"/>
+ <component name="Doxygen" desktop="yes" license_type="OSS" source="no" partial_contribution="no" license_status="no" copyright_holder="http://www.stack.nl/~dimitri/doxygen/" license="Copyright © 1997-2008 by Dimitri van Heesch (http://www.stack.nl/~dimitri/doxygen/)" comment="3rd party GNU tool which is needed to extract in-soyrce comments. Currently re-distributed as binaries by Symbian." impl_language="c.c++" external="true" infra="true" plugin="no" old_model="TCL" contribution="available"/>
+ </collection>
+ <collection name="Eclipse Doc Build" level="2">
+ <component name="DP Doc Build" desktop="yes" comment="Branched version of DevLib Build in DP codeline used to build documentation for the SITK and other Eclipse based products" impl_language="python" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ <collection name="Generated" level="GUI">
+ <component name="DevLib (HTML)" desktop="yes" source="no" partial_contribution="yes" impl_language="data" mcl_component="Developer Library HTML" comment="Generated version of 'Developer Library Source' in HTML form" codeline="mcl" generated="true" plugin="no" old_model="TCL" in_production_device_rom="no" platform_critical="no" contribution="partial">
+ <unit root="MCL" mrp="app/systemdocumentation/generated/devlib_htmld_/group/shared/developerlibrary_doc_plain_html.mrp"/>
+ </component>
+ <component name="DevLib (HTMLD)" desktop="yes" source="no" partial_contribution="yes" impl_language="data" mcl_component="Developer Library Help" comment="Generated version of 'Developer Library Source' in HTMLD form" codeline="mcl" generated="true" plugin="no" old_model="TCL" in_production_device_rom="no" platform_critical="no" contribution="partial">
+ <unit root="MCL" version="9.5" bldFile="app/systemdocumentation/generated/devlib_htmld_/group/devlib95" mrp="app/systemdocumentation/generated/devlib_htmld_/group/devlib95/developerlibrary_doc_html.mrp"/>
+ <unit root="MCL" mrp="app/systemdocumentation/generated/devlib_htmld_/group/devlib94/developerlibrary_doc_html.mrp" version="9.4" bldFile="app/systemdocumentation/generated/devlib_htmld_/group/devlib94"/>
+ </component>
+ </collection>
+ <collection name="Documentation Integration" level="GUI">
+ <component name="DevLib Hover Help" desktop="yes" impl_language="java.eclipse" introduced="Saffron" plugin="no" old_model="TCL" contribution="contributed"/>
+ </collection>
+ </block>
+ </layer>
+ <layer name="complementary" long-name="Complementary" span="1" levels="util ui custom" contribution="excluded">
+ <block long-name="Content Download" tech_domain="se" level="ui" name="contentdownload" levels="unused" contribution="excluded">
+ <collection name="ui" id="ui" long-name="UI" contribution="excluded">
+ <component name="schemeplugin" old_model="s60" old_layer="complementary" old_package="ncdui" old_collection="ui" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ncdui\ui\schemeplugin" source_size="0.0"/>
+ <component name="view" old_model="s60" old_layer="complementary" old_package="ncdui" old_collection="ui" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60=""/>
+ </collection>
+ </block>
+ <block long-name="CCP1" tech_domain="ocp" level="custom" name="ccp1" levels="1 2" contribution="excluded">
+ <collection name="Variantoperator1001_1001" id="Variantoperator1001_1001" long-name="Variant Operator 1001 1001" level="2" contribution="excluded">
+ <component name="Variantoperator1001_1001 compo" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="Variantoperator1001_1001" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\Variantoperator1001_1001\Variantoperator1001_1001 compo" source_size="0.0"/>
+ </collection>
+ <collection name="cmccskins" id="cmccskins" long-name="CMCC Skins" level="2" contribution="excluded">
+ <component name="cmccskins compo" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="cmccskins" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\cmccskins\cmccskins compo" source_size="0.0"/>
+ </collection>
+ <collection name="cmccsmsr" id="cmccsmsr" long-name="CMCC SMSR" level="2" contribution="excluded">
+ <component name="cmccsmsr.exe=binary" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="cmccsmsr" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\cmccsmsr\cmccsmsr.exe=binary" source_size="0.0"/>
+ </collection>
+ <collection name="epoc32" id="epoc32" long-name="Epoc32" level="1" contribution="excluded">
+ <component name="epoc32 compo" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="epoc32" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\epoc32\epoc32 compo" source_size="0.0"/>
+ </collection>
+ <collection name="icons" id="icons" long-name="Icons" level="1" contribution="excluded">
+ <component name="icons compo" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="icons" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\icons\icons compo" source_size="0.0"/>
+ </collection>
+ <collection name="operatormenu" id="operatormenu" long-name="Operator Menu" level="1" contribution="excluded">
+ <component name="ChinaMobileService" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="operatormenu" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\operatormenu\ChinaMobileService" source_size="0.0"/>
+ <component name="CMMusic" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="operatormenu" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\operatormenu\CMMusic" source_size="0.0"/>
+ <component name="CMPhoneBook" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="operatormenu" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\operatormenu\CMPhoneBook" source_size="0.0"/>
+ <component name="CustomerService" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="operatormenu" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\operatormenu\CustomerService" source_size="0.0"/>
+ <component name="Monternet" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="operatormenu" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\operatormenu\Monternet" source_size="0.0"/>
+ <component name="MyFavorite" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="operatormenu" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\operatormenu\MyFavorite" source_size="0.0"/>
+ </collection>
+ <collection name="s60" id="s60" long-name="S60" level="1" contribution="excluded">
+ <component name="s60 compo" old_model="s60" old_layer="complementary" old_package="ccp1" old_collection="s60" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\ccp1\s60\s60 compo" source_size="0.0"/>
+ </collection>
+ </block>
+ <block long-name="Tfx Server" tech_domain="ui" level="util" name="tfxserver" levels="server client plugin" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <collection name="TfxSrvPlugin" id="TfxSrvPlugin" long-name="Tfx Server Plugin" level="plugin" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="TfxSrvPlugin.dll=binary" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="TfxSrvPlugin" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\complementary\tfxserver\TfxSrvPlugin\TfxSrvPlugin.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="tfxsrvoomplugin" id="tfxsrvoomplugin" long-name="Tfx Server OOM Plugin" level="plugin" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="10282E4F.dll=binary" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="tfxsrvoomplugin" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\complementary\tfxserver\tfxsrvoomplugin\10282E4F.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="tfxlistbox" id="tfxlistbox" long-name="Tfx Listbox" level="client" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="tfxlistboxplugin" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="tfxlistbox" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\complementary\tfxserver\tfxlistbox\tfxlistboxplugin" source_size="2733.6"/>
+ <component name="tfxlistbox.dll=binary" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="tfxlistbox" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" in_production_device_rom="" platform_critical="no" not_used_by_s60="" path="\s60\complementary\tfxserver\tfxlistbox\tfxlistbox.dll=binary" source_size="0.0"/>
+ </collection>
+ <collection name="tfxserver.dll=binary" id="tfxserver.dll=binary" long-name="Tfx Server" level="server" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="tfxserver.dll=binary compo" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="tfxserver.dll=binary" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" platform_critical="no"/>
+ </collection>
+ <collection name="tfxserverclient.dll=binary" id="tfxserverclient.dll=binary" long-name="Tfx Server Client" level="client" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="tfxserverclient.dll=binary compo" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="tfxserverclient.dll=binary" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" platform_critical="no"/>
+ </collection>
+ <collection name="transitionserver.dll=binary" id="transitionserver.dll=binary" long-name="Transition Server" level="server" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="transitionserver.dll=binary compo" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="transitionserver.dll=binary" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" platform_critical="no"/>
+ </collection>
+ <collection name="10281f7f.dll=binary" long-name="10281f7f.dll" id="10281F7F.DLL=binary" level="plugin" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="10281f7f.dll=binary compo" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="10281F7F.DLL=binary" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" platform_critical="no"/>
+ </collection>
+ <collection name="gfxtransadapter.dll" long-name="Gfx Trans Adapter" id="GFXTRANSADAPTER.DLL=binary" level="plugin" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="gfxtransadapter.dll compo" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="GFXTRANSADAPTER.DLL=binary" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" platform_critical="no"/>
+ </collection>
+ <collection name="tfxserveranim.dll=binary" id="tfxserveranim.dll=binary" long-name="Tfx Server Anim" level="server" contribution="excluded" comment="This package doesn't compile without kastor.lib from TAT." platform_critical="no">
+ <component name="tfxserveranim.dll=binary compo" old_model="s60" old_layer="complementary" old_package="tfxserver" old_collection="tfxserveranim.dll=binary" comment="This package doesn't compile without kastor.lib from TAT." contribution="excluded" platform_critical="no"/>
+ </collection>
+ </block>
+ <block long-name="Webvideo" tech_domain="rt" level="ui" name="webvideo" levels="unused" contribution="excluded">
+ <collection name="Helix_Flash_Video" id="Helix_Flash_Video" long-name="Helix Flash Video" contribution="excluded">
+ <component name="HxPostUpgrade" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="Helix_Flash_Video" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\Helix_Flash_Video\HxPostUpgrade" source_size="0.0"/>
+ <component name="Spark" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="Helix_Flash_Video" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\Helix_Flash_Video\Spark" source_size="0.0"/>
+ <component name="Utilities" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="Helix_Flash_Video" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\Helix_Flash_Video\Utilities" source_size="0.0"/>
+ <component name="VP6" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="Helix_Flash_Video" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\Helix_Flash_Video\VP6" source_size="0.0"/>
+ </collection>
+ <collection name="flashlite_3_0" id="flashlite_3_0" long-name="Flashlite 3.0" contribution="excluded">
+ <component name="client" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="flashlite_3_0" comment="" contribution="excluded" in_production_device_rom="yes" platform_critical="no" not_used_by_s60=""/>
+ <component name="flashviddec" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="flashlite_3_0" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\flashlite_3_0\flashviddec" source_size="0.0"/>
+ <component name="player" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="flashlite_3_0" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\flashlite_3_0\player" source_size="0.0"/>
+ <component name="lib" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="flashlite_3_0" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\flashlite_3_0\lib" source_size="0.0"/>
+ <component name="loc" old_model="s60" old_layer="complementary" old_package="webvideo" old_collection="flashlite_3_0" comment="" contribution="excluded" in_production_device_rom="" platform_critical="" not_used_by_s60="" path="\s60\complementary\webvideo\flashlite_3_0\loc" source_size="0.0"/>
+ </collection>
+ </block>
+ </layer>
+ </systemModel>
+</SystemDefinition>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dummy_foundation/update_repos.pl Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,69 @@
+#! perl
+
+use strict;
+
+# update_repos.pl
+
+my %repos;
+
+foreach my $layer ("os", "mw", "app")
+ {
+ opendir DIR, $layer;
+ my @packages = grep !/^\.\.?$/, readdir DIR;
+ closedir DIR;
+ foreach my $package (@packages)
+ {
+ $repos{"$layer/$package"} = 1;
+ }
+ }
+
+print join("\n",sort keys %repos,"","");
+
+my $tree = "/opt/hg/repos/sf/";
+
+foreach my $layer ("os", "mw", "app")
+ {
+ opendir DIR, "$tree$layer";
+ my @packages = grep !/^\.\.?$/, readdir DIR;
+ closedir DIR;
+ foreach my $package (@packages)
+ {
+ if (defined $repos{"$layer/$package"})
+ {
+ # this one is still relevant
+ next;
+ }
+ # package name has changed, I expect
+ print "Old package $layer/$package is now obsolete\n";
+ rename "$tree$layer/$package", "$tree"."obsolete/".$package;
+ }
+ }
+
+foreach my $repo (sort keys %repos)
+ {
+ print "\n\nProcessing $repo\n";
+ my ($layer,$package) = split /\//, $repo;
+ my $master = "$tree$repo/MCL_$package/.hg";
+
+ if (-d $master)
+ {
+ # repo already exists - move it into place
+ rename "$tree$repo/MCL_$package/.hg", "$repo/.hg";
+ }
+ else
+ {
+ # New repo
+ print "New repository $repo\n";
+ mkdir "$tree$layer";
+ mkdir "$tree$layer/$package";
+ mkdir "$tree$layer/$package/MCL_$package";
+ }
+
+ chdir $repo;
+ system("hg","init") if (!-d ".hg");
+ system("hg", "commit", "--addremove", "-m", "updated $repo");
+ chdir "../..";
+ rename "$repo/.hg", "$tree$repo/MCL_$package/.hg";
+ }
+
+
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/synch_hg_p4/synch_hg_p4.pl Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,677 @@
+#! perl
+
+# sync_hg_p4.pl
+
+use strict;
+use Getopt::Long;
+use File::Temp qw/ tempfile tempdir /; # for tempfile()
+
+my $verbose;
+my $debug = 0;
+my $rootdir;
+my $help;
+my $remoterepo;
+my $hgbranch;
+my $sync_prefix = "sync_";
+
+# abandon_sync, all ye who enter here
+# This should send a notification to someone, as it will probably mean manual repair
+#
+sub abandon_sync(@)
+ {
+ print "ERROR - synchronisation of $rootdir abandoned\n\n";
+ print @_;
+ print "\n\n";
+ exit(1);
+ }
+
+# utility to run an external command
+#
+sub run_cmd($;$)
+ {
+ my ($cmd,$failurematch) = @_;
+ print "--- $cmd\n" if ($verbose || $debug);
+ my @output = `$cmd`;
+ print @output,"\n---\n" if ($debug);
+
+ if (defined $failurematch)
+ {
+ if (grep /$failurematch/, @output)
+ {
+ abandon_sync("COMMAND FAILED: $cmd\n", @output,"\n\n",
+ "Output matched $failurematch\n");
+ }
+ else
+ {
+ print "CMD OK - Didn't match /$failurematch/\n" if ($debug);
+ }
+ }
+ if ($?)
+ {
+ print @output,"\n---\n" if ($verbose);
+ abandon_sync("COMMAND FAILED: exit status = $?\n",$cmd,"\n");
+ }
+
+ return @output;
+ }
+
+
+# -------------- hg section -------------
+#
+# Code relating to other SCM system is abstracted into
+# functions to do relatively simple actions. This section
+# contains the driving logic for the script, and all of the
+# manipulations of Mercurial
+#
+
+sub scm_usage(); # forward declarations
+sub scm_options();
+sub scm_init($@);
+sub scm_checkout($); # non-destructive, i.e. leave untouched any workspace files not managed in SCM
+sub scm_checkin($$$$$$);
+
+sub Usage(;$)
+ {
+ my ($errmsg) = @_;
+ print "\nERROR: $errmsg\n" if (defined $errmsg);
+ scm_usage();
+ print <<'EOF';
+
+General options:
+
+-root rootdir root of the Mercurial gateway repository
+-v verbose
+-h print this usage information
+
+Setting up a new synchronisation:
+
+-clone remoterepo clones gateway from remote repository
+-branch hgbranch Mercurial branch name (if needed)
+
+EOF
+ exit 1;
+ }
+
+Usage() if !GetOptions(
+ 'root=s' => \$rootdir,
+ 'h' => \$help,
+ 'v' => \$verbose,
+ 'debug' => \$debug,
+ 'clone=s' => \$remoterepo,
+ 'branch=s' => \$hgbranch,
+ scm_options()
+ );
+
+Usage() if ($help);
+
+Usage("Must specify root directory for Mercurial gateway") if (!defined $rootdir);
+Usage("-branch is only used with -clone") if (defined $hgbranch && !defined $remoterepo);
+
+if ($verbose)
+ {
+ my @hgversion = run_cmd("hg --version");
+ print @hgversion;
+ }
+
+# utility to return the heads descended from a particular point
+#
+sub hg_heads($)
+ {
+ my ($rev_on_branch) = @_;
+ my @heads = run_cmd("hg heads --template {rev}\\t{tags}\\n $rev_on_branch");
+ return @heads;
+ }
+
+# return an unsorted list of synchronisation points, identified by
+# tags beginning with "sync_"
+#
+sub hg_syncpoints(;$)
+ {
+ my ($tip_rev) = @_;
+ my @tags = run_cmd("hg tags");
+ my @syncpoints;
+ foreach my $tag (@tags)
+ {
+ if ($tag =~ /^tip\s+(\d+):\S+$/)
+ {
+ $$tip_rev = $1 if (defined $tip_rev);
+ next;
+ }
+ if ($tag =~ /^$sync_prefix(.*\S)\s+\S+$/)
+ {
+ push @syncpoints, $1;
+ next
+ }
+ }
+ if ($debug)
+ {
+ printf "Found %d syncpoints in %d tags:", scalar @syncpoints, scalar @tags;
+ print join("\n * ", "",@syncpoints), "\n";
+ }
+ return @syncpoints;
+ }
+
+my $hg_updated = 0;
+
+# Update the Mercurial workspace to a given sync point
+#
+sub hg_checkout($)
+ {
+ my ($scmref) = @_;
+
+ my $tag = $sync_prefix.$scmref;
+ my @output = run_cmd("hg update --clean --rev $tag", "^abort:");
+ $hg_updated = 1; # could check the output in case it didn't change anything
+ }
+
+# 0. Create the gateway repository, if -clone is specified
+
+if (defined $remoterepo)
+ {
+ Usage("Cannot create gateway because $rootdir already exists") if (-d $rootdir);
+
+ my $clonecmd = "clone";
+ $clonecmd .= " --rev $hgbranch" if (defined $hgbranch);
+ my @output = run_cmd("hg $clonecmd $remoterepo $rootdir");
+ $hg_updated = 1;
+ }
+
+chdir $rootdir;
+Usage("$rootdir is not a Mercurial repository") if (!-d ".hg");
+
+my $something_to_push = 0;
+
+# 1. Prime the SCM system, and get the ordered list of changes available to
+# convert into Mercurial commits
+
+my $first_sync; # is this the first synchronisation?
+my $scm_tip_only; # can we process a series of changes in the SCM system?
+
+my $tip_rev = -1;
+my @syncpoints = hg_syncpoints(\$tip_rev);
+
+if (scalar @syncpoints != 0)
+ {
+ $first_sync = 0; # no - it's already synchronised
+ $scm_tip_only = 0; # so can allow sequence of SCM changes
+ }
+else
+ {
+ print "First synchronisation through this gateway\n" if ($verbose);
+ $first_sync = 1;
+ if ($tip_rev != -1)
+ {
+ $scm_tip_only = 1; # because there's already something in the repository
+ }
+ else
+ {
+ print "Mercurial repository is empty\n" if ($verbose);
+ $scm_tip_only = 0; # allow multiple SCM changes, because there's nothing to merge with
+ }
+ }
+
+my $opening_scmtag; # ancestor by which we judge the headcount of the result
+my $latest_scmtag;
+
+my @scmrefs = scm_init($scm_tip_only, @syncpoints);
+
+if (scalar @scmrefs == 0)
+ {
+ print "No changes to process in local SCM\n";
+ $opening_scmtag = $tip_rev;
+ }
+else
+ {
+ $opening_scmtag = $sync_prefix.$scmrefs[0];
+ }
+$latest_scmtag = $opening_scmtag;
+
+if ($scm_tip_only && scalar @scmrefs > 1)
+ {
+ print "ERROR - cannot handle multiple SCM changes in this situation\n";
+ exit(1);
+ }
+
+# 2. Process the SCM changes, turning them into Mercurial commits and marking with tags
+# - we guarantee that there is at most one change, if this is the first synchronisation
+
+foreach my $scmref (@scmrefs)
+ {
+ my ($user,$date,@description) = scm_checkout($scmref);
+
+ # commit the result
+
+ my ($fh,$filename) = tempfile();
+ print $fh join("\n",@description), "\n";
+ close $fh;
+
+ run_cmd("hg commit --addremove --date \"$date\" --user \"$user\" --logfile $filename", "^abort\:");
+ $something_to_push = 1;
+
+ unlink($filename); # remove temporary file
+
+ my $tag = $sync_prefix.$scmref;
+ run_cmd("hg tag --local $tag");
+ $latest_scmtag = $tag;
+ print "Synchronised $scmref into Mercurial gateway repository\n";
+ }
+
+# 3. Put the full Mercurial state into the SCM, if this is the first synchronisation
+
+if ($first_sync)
+ {
+ my @traceback = run_cmd("hg log --limit 1 --template {rev}\\t{node}\\t{tags}\\n");
+ my $line = shift @traceback;
+
+ chomp $line;
+ my ($rev,$node,$tags) = split /\t/,$line;
+
+ if ($rev != 0)
+ {
+ # repository was not empty, so need to commit the current state back into Perforce
+
+ my @description = run_cmd("hg log --rev $rev --template \"{author}\\n{date|isodate}\\n{desc}\"");
+ chomp @description;
+ my $author = shift @description;
+ my $date = shift @description;
+ my @changes = run_cmd("hg status --clean"); # include info on unmodified files
+ @changes = sort @changes;
+
+ # Deliver changes to SCM
+ my $scmref = scm_checkin($node,$author,$date,\@changes,\@description,$tags);
+
+ my $tag = $sync_prefix.$scmref;
+ run_cmd("hg tag --local $tag");
+ $latest_scmtag = $tag;
+ print "Synchronised $scmref from Mercurial gateway, to initialise the synchronisation\n";
+ }
+
+ $opening_scmtag = $latest_scmtag; # don't consider history before this point
+ }
+
+
+# 3. pull from Mercurial default path, deal with new stuff
+
+my @pull_output = run_cmd("hg pull --update");
+$hg_updated = 1;
+
+my @heads = hg_heads($opening_scmtag);
+
+if (scalar @heads > 1)
+ {
+ # more than one head - try a safe merge
+ print "WARNING: multiple heads\n",@heads,"\nMerge is needed\n\n\n" if ($verbose);
+
+ my @merge_output = run_cmd("hg --config \"ui.merge=internal:fail\" merge"); # which head?
+ if ($merge_output[0] =~ / 0 files unresolved/)
+ {
+ # successful merge - commit it.
+ run_cmd("hg commit --message \"Automatic merge\"");
+ $something_to_push = 1;
+ }
+ else
+ {
+ # clean up any partially merged files
+ run_cmd("hg update -C");
+ }
+ }
+
+# 4. Identify the sequence of Mercurial changes on the trunk and put them into the SCM
+# - Do only the head revision if this is the first synchronisation, to avoid copying ancient history
+
+my $options = "--follow-first";
+$options .= " --prune $latest_scmtag";
+
+my @traceback = run_cmd("hg log $options --template {rev}\\t{node}\\t{tags}\\n");
+foreach my $line (reverse @traceback)
+ {
+ chomp $line;
+ my ($rev,$node,$tags) = split /\t/,$line;
+ if ($tags =~ /$sync_prefix/)
+ {
+ # shouldn't happen - it would mean that tip goes back to an ancestor
+ # of the latest sync point
+ abandon_sync("Cannot handle this structure\n",@traceback);
+ }
+
+ # Read commit information and update workspace from Mercurial
+
+ my @description = run_cmd("hg log --rev $rev --template \"{author}\\n{date|isodate}\\n{desc}\"");
+ chomp @description;
+ my $author = shift @description;
+ my $date = shift @description;
+ my @changes = run_cmd("hg status --rev $latest_scmtag --rev $rev");
+ @changes = sort @changes;
+
+ run_cmd("hg update -C --rev $rev");
+ $hg_updated = 1;
+
+ # Deliver changes to SCM
+ my $scmref = scm_checkin($node,$author,$date,\@changes,\@description,$tags);
+
+ # Tag as the latest sync point
+ my $tag = $sync_prefix.$scmref;
+ run_cmd("hg tag --local $tag");
+ $latest_scmtag = $tag;
+ print "Synchronised $scmref from Mercurial gateway\n";
+ }
+
+# 3. push changes to the destination gateway
+
+if ($something_to_push)
+ {
+ my @output = run_cmd("hg -v push --force --rev $latest_scmtag");
+ print "\n",@output,"\n" if ($verbose);
+ print "Destination Mercurial repository has been updated\n";
+ }
+else
+ {
+ print "Nothing to push to destination Mercurial repository\n";
+ }
+
+# 4. Check to see if we are in a clean state
+
+@heads = hg_heads($opening_scmtag);
+if (scalar @heads > 1)
+ {
+ print "\n------------------\n";
+ print "WARNING: Mercurial repository has multiple heads - manual merge recommended\n";
+ }
+
+exit(0);
+
+
+# -------------- SCM section -------------
+#
+# Code relating to non-Mercurial SCM system.
+# This version implements the sync with Perforce
+#
+
+sub scm_usage()
+ {
+ print <<'EOF';
+
+perl sync_hg_p4.pl -root rootdir [options]
+version 0.7
+
+Synchronise a branch in Perforce with a branch in Mercurial.
+
+The branch starts at rootdir, which is a local Mercurial repository.
+The Perforce clientspec is assumed to exist, to specify modtime & rmdir,
+and to exclude the .hg directory from the rootdir.
+
+The tool will sync rootdir/... to the specified changelist, and
+then reflect all changes affecting this part of the directory tree into
+Mercurial.
+
+The -first option is used to specify the first sync point if the gateway
+has not been previously synchronised, e.g. when -clone is specified.
+
+Perforce-related options:
+
+-m maxchangelist highest changelist to consider
+ defaults to #head
+
+EOF
+ }
+
+my $max_changelist;
+
+sub scm_options()
+ {
+ # set defaults
+
+ $max_changelist = "#head";
+
+ # return the GetOpt specification
+ return (
+ 'm|max=s' => \$max_changelist,
+ );
+ }
+
+sub p4_sync($)
+ {
+ my ($changelist)= @_;
+
+ my $sync = $hg_updated? "sync -k":"sync";
+ my @sync_output = run_cmd("p4 $sync ...\@$changelist 2>&1");
+
+ $hg_updated = 0; # avoid doing sync -f next time, if possible
+ return @sync_output;
+ }
+
+sub scm_init($@)
+ {
+ my ($tip_only, @syncpoints) = @_;
+
+ my $first_changelist;
+
+ # decide on the range of changelists to process
+
+ if ($tip_only)
+ {
+ # Script says we must synchronise from the Perforce tip revision
+ my @changes = run_cmd("p4 changes -m2 ...");
+ foreach my $change (@changes)
+ {
+ if ($change =~ /^(Change (\d+) on (\S+) by (\S+)@\S+) /)
+ {
+ $first_changelist = $2;
+ last;
+ }
+ }
+ if (!defined $first_changelist)
+ {
+ print "Perforce branch contains no changes\n";
+ return ();
+ }
+ print "Synchronisation from tip ($first_changelist)\n" if ($verbose);
+ $max_changelist = "#head";
+ }
+ else
+ {
+ # deduce the last synchronisation point from the tags
+ @syncpoints = sort {$b <=> $a} @syncpoints;
+ $first_changelist = shift @syncpoints;
+ printf "%d changes previously synchronised, most recent is %s\n",
+ 1+scalar @syncpoints, $first_changelist;
+
+ # Get Mercurial & Perforce into the synchronised state
+ run_cmd("p4 revert ... 2>&1");
+ hg_checkout($first_changelist);
+ p4_sync($first_changelist);
+ $first_changelist += 1; # we've already synched that one
+ }
+
+ # enumerate the changelists
+
+ my @changes = run_cmd("p4 changes ...\@$first_changelist,$max_changelist");
+
+ my @scmrefs;
+ foreach my $change (reverse @changes)
+ {
+ # Change 297463 on 2003/09/24 by ErnestoG@LON-ERNESTOG02 'Initial MRP files for Component
+ if ($change =~ /^(Change (\d+) on (\S+) by (\S+)@\S+) /)
+ {
+ my $scmref = $2;
+ push @scmrefs, $2;
+ }
+ }
+
+ if ($debug && scalar @scmrefs > 3)
+ {
+ print "DEBUG - Processing only the first 3 SCM changes\n";
+ @scmrefs = ($scmrefs[0],$scmrefs[1],$scmrefs[2]);
+ }
+
+ if ($verbose)
+ {
+ printf "Found %d new changelists to process (range %d to %s)\n",
+ scalar @scmrefs, $first_changelist, $max_changelist;
+ print join(", ", @scmrefs), "\n";
+ }
+
+ return @scmrefs;
+ }
+
+# scm_checkout
+# Update the workspace to reflect the given SCM reference
+#
+sub scm_checkout($)
+ {
+ my ($scmref) = @_;
+
+ my @changelist = run_cmd("p4 describe -s $scmref 2>&1", "$scmref - no such changelist");
+
+ my @change_description;
+ my $change_date;
+ my $change_user;
+
+ my $change_summary = shift @changelist;
+ if ($change_summary =~ /^Change (\d+) by (\S+)@\S+ on (\S+ \S+)/)
+ {
+ $change_user = $2;
+ $change_date = $3;
+ }
+ else
+ {
+ print "Failed to parse change summary => $change_summary\n";
+ exit(1);
+ }
+
+ # Extract the descriptive part of the change description, watching for
+ # the Symbian XML format enforced by the submission checker
+ #
+ my $symbian_format = 0;
+ foreach my $line (@changelist)
+ {
+ last if ($line =~ /^(Affected files|Jobs fixed)/);
+
+ $line =~ s/^\t//; # remove leading tab from description text
+ if ($line =~ /^<EXTERNAL>/)
+ {
+ $symbian_format = 1;
+ @change_description = ();
+ next;
+ }
+ if ($line =~ /^<\/EXTERNAL>/)
+ {
+ $symbian_format = 2;
+ next;
+ }
+
+ chomp $line;
+ push @change_description, $line if ($symbian_format < 2);
+
+ # <detail submitter= "Sangamma VChandangoudar" />
+ if ($line =~ /detail submitter=\s*\"([^\"]+)\"/) # name in " marks
+ {
+ $change_user = $1;
+ }
+ }
+
+ $change_date =~ s/\//-/g; # convert to yyyy-mm-dd hh:mm::ss"
+
+ p4_sync($scmref);
+
+ return ($change_user,$change_date,@change_description);
+ }
+
+# scm_checkin
+# Describe the changes to the workspace as an SCM change
+# Return the new SCM reference
+#
+sub scm_checkin($$$$$$)
+ {
+ my ($hgnode,$author,$date,$changes,$description,$tags) = @_;
+
+ my @hg_tags = grep !/^tip$/, split /\s+/, $tags;
+ my @p4_edit;
+ my @p4_delete;
+ my @p4_add;
+
+ foreach my $line (@$changes)
+ {
+ my $type = substr($line,0,2,""); # removes type as well as extracting it
+ if ($type eq "M ")
+ {
+ push @p4_edit, $line;
+ next;
+ }
+ if ($type eq "A " || $type eq "C ")
+ {
+ push @p4_add, $line;
+ next;
+ }
+ if ($type eq "R ")
+ {
+ push @p4_delete, $line;
+ next;
+ }
+
+ abandon_sync("Unexpected hg status line: $type$line");
+ }
+
+ if (scalar @p4_add)
+ {
+ open P4ADD, "|p4 -x - add";
+ print P4ADD @p4_add;
+ close P4ADD;
+ abandon_sync("Perforce error on p4 add: $?\n") if ($?);
+ }
+
+ if (scalar @p4_edit)
+ {
+ open P4EDIT, "|p4 -x - edit";
+ print P4EDIT @p4_edit;
+ close P4EDIT;
+ abandon_sync("Perforce error on p4 edit: $?\n") if ($?);
+ }
+ if (scalar @p4_delete)
+ {
+ open P4DELETE, "|p4 -x - delete";
+ print P4DELETE @p4_delete;
+ close P4DELETE;
+ abandon_sync("Perforce error on p4 delete: $?\n") if ($?);
+ }
+
+ my @pending_change = run_cmd("p4 change -o");
+
+ # Can't do anything with the author or date information?
+
+ my ($fh,$filename) = tempfile();
+
+ my $hasfiles = 0;
+ foreach my $line (@pending_change)
+ {
+ if ($line =~ /<enter description here>/)
+ {
+ print $fh "\t(Synchronised from Mercurial commit $hgnode: $date $author)";
+ print $fh "\t(Mercurial tags: ", join(", ",$tags),")" if (scalar @hg_tags != 0);
+ print $fh join("\n\t", "", @$description), "\n";
+ next;
+ }
+ $hasfiles = 1 if ($line =~/^Files:/);
+ print $fh $line;
+ }
+
+ close $fh;
+
+ abandon_sync("No files in Perforce submission? $filename\n", @pending_change) if (!$hasfiles);
+
+ my @submission = run_cmd("p4 submit -i < $filename 2>&1");
+
+ unlink($filename); # remove temporary file
+
+ # Change 1419488 renamed change 1419490 and submitted.
+ # Change 1419487 submitted.
+ foreach my $line (reverse @submission)
+ {
+ if ($line =~ /change (\d+)( and)? submitted/i)
+ {
+ return $1;
+ }
+ }
+
+ abandon_sync("Failed to parse output of p4 submit:\n",@submission);
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/synch_hg_p4/synch_hg_xxx.pl Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,657 @@
+#! perl
+
+# sync_hg_xxx.pl
+
+use strict;
+use Getopt::Long;
+use File::Temp qw/ tempfile tempdir /; # for tempfile()
+
+my $verbose;
+my $debug = 0;
+my $rootdir;
+my $help;
+my $remoterepo;
+my $hgbranch;
+my $sync_prefix = "sync_";
+
+# abandon_sync, all ye who enter here
+# This should send a notification to someone, as it will probably mean manual repair
+#
+sub abandon_sync(@)
+ {
+ print "ERROR - synchronisation of $rootdir abandoned\n\n";
+ print @_;
+ print "\n\n";
+ exit(1);
+ }
+
+# utility to run an external command
+#
+sub run_cmd($;$)
+ {
+ my ($cmd,$failurematch) = @_;
+ print "--- $cmd\n" if ($verbose || $debug);
+ my @output = `$cmd`;
+ print @output,"\n---\n" if ($debug);
+
+ if (defined $failurematch)
+ {
+ if (grep /$failurematch/, @output)
+ {
+ abandon_sync("COMMAND FAILED: $cmd\n", @output,"\n\n",
+ "Output matched $failurematch\n");
+ }
+ else
+ {
+ print "CMD OK - Didn't match /$failurematch/\n" if ($debug);
+ }
+ }
+ if ($?)
+ {
+ print @output,"\n---\n" if ($verbose);
+ abandon_sync("COMMAND FAILED: exit status = $?\n",$cmd,"\n");
+ }
+
+ return @output;
+ }
+
+
+# -------------- hg section -------------
+#
+# Code relating to other SCM system is abstracted into
+# functions to do relatively simple actions. This section
+# contains the driving logic for the script, and all of the
+# manipulations of Mercurial
+#
+
+sub scm_usage(); # forward declarations
+sub scm_options();
+sub scm_init($@);
+sub scm_checkout($); # non-destructive, i.e. leave untouched any workspace files not managed in SCM
+sub scm_checkin($$$$$$);
+
+sub Usage(;$)
+ {
+ my ($errmsg) = @_;
+ print "\nERROR: $errmsg\n" if (defined $errmsg);
+ scm_usage();
+ print <<'EOF';
+
+General options:
+
+-root rootdir root of the Mercurial gateway repository
+-v verbose
+-h print this usage information
+
+Setting up a new synchronisation:
+
+-clone remoterepo clones gateway from remote repository
+-branch hgbranch Mercurial branch name (if needed)
+
+EOF
+ exit 1;
+ }
+
+Usage() if !GetOptions(
+ 'root=s' => \$rootdir,
+ 'h' => \$help,
+ 'v' => \$verbose,
+ 'debug' => \$debug,
+ 'clone=s' => \$remoterepo,
+ 'branch=s' => \$hgbranch,
+ scm_options()
+ );
+
+Usage() if ($help);
+
+Usage("Must specify root directory for Mercurial gateway") if (!defined $rootdir);
+Usage("-branch is only used with -clone") if (defined $hgbranch && !defined $remoterepo);
+
+if ($verbose)
+ {
+ my @hgversion = run_cmd("hg --version");
+ print @hgversion;
+ }
+
+# utility to return the heads descended from a particular point
+#
+sub hg_heads($)
+ {
+ my ($rev_on_branch) = @_;
+ my @heads = run_cmd("hg heads --template {rev}\\t{tags}\\n $rev_on_branch");
+ return @heads;
+ }
+
+# return an unsorted list of synchronisation points, identified by
+# tags beginning with "sync_"
+#
+sub hg_syncpoints(;$)
+ {
+ my ($tip_rev) = @_;
+ my @tags = run_cmd("hg tags");
+ my @syncpoints;
+ foreach my $tag (@tags)
+ {
+ if ($tag =~ /^tip\s+(\d+):\S+$/)
+ {
+ $$tip_rev = $1 if (defined $tip_rev);
+ next;
+ }
+ if ($tag =~ /^$sync_prefix(.*\S)\s+\S+$/)
+ {
+ push @syncpoints, $1;
+ next
+ }
+ }
+ if ($debug)
+ {
+ printf "Found %d syncpoints in %d tags:", scalar @syncpoints, scalar @tags;
+ print join("\n * ", "",@syncpoints), "\n";
+ }
+ return @syncpoints;
+ }
+
+my $hg_updated = 0;
+
+# Update the Mercurial workspace to a given sync point
+#
+sub hg_checkout($)
+ {
+ my ($scmref) = @_;
+
+ my $tag = $sync_prefix.$scmref;
+ my @output = run_cmd("hg update --clean --rev $tag", "^abort:");
+ $hg_updated = 1; # could check the output in case it didn't change anything
+ }
+
+# 0. Create the gateway repository, if -clone is specified
+
+if (defined $remoterepo)
+ {
+ Usage("Cannot create gateway because $rootdir already exists") if (-d $rootdir);
+
+ my $clonecmd = "clone";
+ $clonecmd .= " --rev $hgbranch" if (defined $hgbranch);
+ my @output = run_cmd("hg $clonecmd $remoterepo $rootdir");
+ $hg_updated = 1;
+ }
+
+chdir $rootdir;
+Usage("$rootdir is not a Mercurial repository") if (!-d ".hg");
+
+my $something_to_push = 0;
+
+# 1. Prime the SCM system, and get the ordered list of changes available to
+# convert into Mercurial commits
+
+my $first_sync; # is this the first synchronisation?
+my $scm_tip_only; # can we process a series of changes in the SCM system?
+
+my $tip_rev = -1;
+my @syncpoints = hg_syncpoints(\$tip_rev);
+
+if (scalar @syncpoints != 0)
+ {
+ $first_sync = 0; # no - it's already synchronised
+ $scm_tip_only = 0; # so can allow sequence of SCM changes
+ }
+else
+ {
+ print "First synchronisation through this gateway\n" if ($verbose);
+ $first_sync = 1;
+ if ($tip_rev != -1)
+ {
+ $scm_tip_only = 1; # because there's already something in the repository
+ }
+ else
+ {
+ print "Mercurial repository is empty\n" if ($verbose);
+ $scm_tip_only = 0; # allow multiple SCM changes, because there's nothing to merge with
+ }
+ }
+
+my $opening_scmtag; # ancestor by which we judge the headcount of the result
+my $latest_scmtag;
+
+my @scmrefs = scm_init($scm_tip_only, @syncpoints);
+
+if (scalar @scmrefs == 0)
+ {
+ print "No changes to process in local SCM\n";
+ $opening_scmtag = $tip_rev;
+ }
+else
+ {
+ $opening_scmtag = $sync_prefix.$scmrefs[0];
+ }
+$latest_scmtag = $opening_scmtag;
+
+if ($scm_tip_only && scalar @scmrefs > 1)
+ {
+ print "ERROR - cannot handle multiple SCM changes in this situation\n";
+ exit(1);
+ }
+
+# 2. Process the SCM changes, turning them into Mercurial commits and marking with tags
+# - we guarantee that there is at most one change, if this is the first synchronisation
+
+foreach my $scmref (@scmrefs)
+ {
+ my ($user,$date,@description) = scm_checkout($scmref);
+
+ # commit the result
+
+ my ($fh,$filename) = tempfile();
+ print $fh join("\n",@description), "\n";
+ close $fh;
+
+ run_cmd("hg commit --addremove --date \"$date\" --user \"$user\" --logfile $filename", "^abort\:");
+ $something_to_push = 1;
+
+ unlink($filename); # remove temporary file
+
+ my $tag = $sync_prefix.$scmref;
+ run_cmd("hg tag --local $tag");
+ $latest_scmtag = $tag;
+ print "Synchronised $scmref into Mercurial gateway repository\n";
+ }
+
+# 3. Put the full Mercurial state into the SCM, if this is the first synchronisation
+
+if ($first_sync)
+ {
+ my @traceback = run_cmd("hg log --limit 1 --template {rev}\\t{node}\\t{tags}\\n");
+ my $line = shift @traceback;
+
+ chomp $line;
+ my ($rev,$node,$tags) = split /\t/,$line;
+
+ if ($rev != 0)
+ {
+ # repository was not empty, so need to commit the current state back into Perforce
+
+ my @description = run_cmd("hg log --rev $rev --template \"{author}\\n{date|isodate}\\n{desc}\"");
+ chomp @description;
+ my $author = shift @description;
+ my $date = shift @description;
+ my @changes = run_cmd("hg status --clean"); # include info on unmodified files
+ @changes = sort @changes;
+
+ # Deliver changes to SCM
+ my $scmref = scm_checkin($node,$author,$date,\@changes,\@description,$tags);
+
+ my $tag = $sync_prefix.$scmref;
+ run_cmd("hg tag --local $tag");
+ $latest_scmtag = $tag;
+ print "Synchronised $scmref from Mercurial gateway, to initialise the synchronisation\n";
+ }
+
+ $opening_scmtag = $latest_scmtag; # don't consider history before this point
+ }
+
+
+# 3. pull from Mercurial default path, deal with new stuff
+
+my @pull_output = run_cmd("hg pull --update");
+$hg_updated = 1;
+
+my @heads = hg_heads($opening_scmtag);
+
+if (scalar @heads > 1)
+ {
+ # more than one head - try a safe merge
+ print "WARNING: multiple heads\n",@heads,"\nMerge is needed\n\n\n" if ($verbose);
+
+ my @merge_output = run_cmd("hg --config \"ui.merge=internal:fail\" merge"); # which head?
+ if ($merge_output[0] =~ / 0 files unresolved/)
+ {
+ # successful merge - commit it.
+ run_cmd("hg commit --message \"Automatic merge\"");
+ $something_to_push = 1;
+ }
+ else
+ {
+ # clean up any partially merged files
+ run_cmd("hg update -C");
+ }
+ }
+
+# 4. Identify the sequence of Mercurial changes on the trunk and put them into the SCM
+# - Do only the head revision if this is the first synchronisation, to avoid copying ancient history
+
+my $options = "--follow-first";
+$options .= " --prune $latest_scmtag";
+
+my @traceback = run_cmd("hg log $options --template {rev}\\t{node}\\t{tags}\\n");
+foreach my $line (reverse @traceback)
+ {
+ chomp $line;
+ my ($rev,$node,$tags) = split /\t/,$line;
+ if ($tags =~ /$sync_prefix/)
+ {
+ # shouldn't happen - it would mean that tip goes back to an ancestor
+ # of the latest sync point
+ abandon_sync("Cannot handle this structure\n",@traceback);
+ }
+
+ # Read commit information and update workspace from Mercurial
+
+ my @description = run_cmd("hg log --rev $rev --template \"{author}\\n{date|isodate}\\n{desc}\"");
+ chomp @description;
+ my $author = shift @description;
+ my $date = shift @description;
+ my @changes = run_cmd("hg status --rev $latest_scmtag --rev $rev");
+ @changes = sort @changes;
+
+ run_cmd("hg update -C --rev $rev");
+ $hg_updated = 1;
+
+ # Deliver changes to SCM
+ my $scmref = scm_checkin($node,$author,$date,\@changes,\@description,$tags);
+
+ # Tag as the latest sync point
+ my $tag = $sync_prefix.$scmref;
+ run_cmd("hg tag --local $tag");
+ $latest_scmtag = $tag;
+ print "Synchronised $scmref from Mercurial gateway\n";
+ }
+
+# 3. push changes to the destination gateway
+
+if ($something_to_push)
+ {
+ my @output = run_cmd("hg -v push --force --rev $latest_scmtag");
+ print "\n",@output,"\n" if ($verbose);
+ print "Destination Mercurial repository has been updated\n";
+ }
+else
+ {
+ print "Nothing to push to destination Mercurial repository\n";
+ }
+
+# 4. Check to see if we are in a clean state
+
+@heads = hg_heads($opening_scmtag);
+if (scalar @heads > 1)
+ {
+ print "\n------------------\n";
+ print "WARNING: Mercurial repository has multiple heads - manual merge recommended\n";
+ }
+
+exit(0);
+
+
+# -------------- SCM section -------------
+#
+# Code relating to non-Mercurial SCM system.
+# This version implements the sync with XXX
+#
+
+# Utility functions you might want to call are:
+#
+# run_cmd($cmd)
+# - Function which runs the specified command in a subshell and returns the stdout output as a list
+# of strings. The whole script will terminate if the command returns with a non-zero exit status.
+#
+# abandon_sync(@messagelines)
+# - Terminate the synchronisation script and pass on the message to someone who might care...
+#
+# $hg_updated
+# - Global variable set to 1 if Mercurial changes the content of the workspace. This can be used to
+# optimise the XXX system processing during initialisation, because it indicates when the workspace
+# can be considered "clean" by the XXX system. Should be set to 0 whenever the XXX system knows the
+# state of the workspace.
+#
+# hg_checkout($scmref)
+# - Function to call "hg update" to the sync label associated with $scmref. Used during the scm_init
+# function as part of getting the workspaces in harmony before transferring changes. Will set
+# $hg_updated to 1.
+
+
+# scm_usage()
+#
+# This function is called to supply the main "usage" statement for the script, as the
+# interesting description is all about the interaction between Mercurial and XXX. It takes no
+# arguments and should return nothing.
+#
+sub scm_usage()
+ {
+ print <<'EOF';
+
+perl sync_hg_xxx.pl -root rootdir [options]
+version 0.7
+
+Synchronise a branch in XXX with a branch in Mercurial.
+
+The branch starts at rootdir, which is a local Mercurial repository.
+The Perforce clientspec is assumed to exist, to specify modtime & rmdir,
+and to exclude the .hg directory from the rootdir.
+
+The tool will sync rootdir/... to the specified changelist, and
+then reflect all changes affecting this part of the directory tree into
+Mercurial.
+
+The -first option is used to specify the first sync point if the gateway
+has not been previously synchronised, e.g. when -clone is specified.
+
+Perforce-related options:
+
+-m maxchangelist highest changelist to consider
+ defaults to #head
+
+EOF
+ }
+
+my $max_changelist; # put XXX-specific global variables here
+
+sub scm_options()
+ {
+ # set defaults
+
+ $max_changelist = "#head"; # initialise the XXX global variables here, otherwise it doesn't happen
+
+ # return the GetOpt specification
+ return (
+ 'm|max=s' => \$max_changelist, # add your own bits of GetOpt arguments
+ );
+ }
+
+
+# scm_init ($tip_only, @syncpoints)
+#
+# The main code calls this routine once, passing two arguments, and expects to get a
+# list of identifiers to XXX changes which could be synchronised as individual Mercurial
+# commits. These references can be anything which can be used as part of a Mercurial tag name,
+# and the main code will call back into this routine supplying the references one at a time
+# in the list order.
+#
+# If $tip_only is true, then the synchronisation can only handle the most recent version
+# of the code in the XXX system, and will not be able to sync intermediate steps. This usually
+# means that this is the first synchronisation of this branch with Mercurial. At most one identifier
+# should be returned.
+#
+# @syncpoints contains a list of identifiers extracted from the local sync_* tags which mark a change
+# that was synchronised with Mercurial in some previous run. This information allows the XXX system
+# to ignore changes which have previously been processed, and to set itself into a state where
+# the workspace corresponds to the contents of the XXX system at that point.
+#
+# The function returns the list of change identifiers for changes to be taken out of XXX and applied
+# to Mercurial. This list can be empty if there are no new changes since the last synchronisation point,
+# or if there is no content in the branch.
+
+sub scm_init($@)
+ {
+ my ($tip_only, @syncpoints) = @_;
+
+ my $first_changelist;
+
+ if ($tip_only)
+ {
+ # Script says we must synchronise from the XXX tip revision
+
+ # Find the first changelist
+
+ if (!defined $first_changelist)
+ {
+ print "XXX branch contains no changes\n";
+ return ();
+ }
+ print "Synchronisation from tip ($first_changelist)\n" if ($verbose);
+ # fall through to complete the initialisation
+ }
+ else
+ {
+ # deduce the last synchronisation point from the @syncpoints list
+
+ $first_changelist = some_function_of(@syncpoints);
+
+ # Get Mercurial & XXX into the synchronised state
+
+ hg_checkout($first_changelist); # call back to Mercurial to update from hg repository
+
+ # get XXX into state associated with $first_changelist
+
+ ## NB this is a bit Perforce specific - you might prefer to separate tip_only processing
+ ## from the normal "changes since last synchronisation" processing
+ ##
+ $first_changelist += 1; # we've already synched that one
+ ##
+ }
+
+ # enumerate the changelists available from the XXX system & return as an ordered list
+
+ my @scmrefs = some_function($first_changelist);
+
+ if ($verbose)
+ {
+ printf "Found %d new changelists to process\n", scalar @scmrefs;
+ print join(", ", @scmrefs), "\n";
+ }
+
+ return @scmrefs;
+ }
+
+# scm_checkout($scmref)
+#
+# Update the workspace to reflect the given SCM reference
+#
+# This update should not change files which are not currently managed by the XXX system, but
+# should delete workspace files if the XX change involved deleting files. It is useful, but not essential,
+# for empty directories to be removed if they become empty due to deletions recorded in the XXX change.
+#
+# The function returns a list containing three things:
+#
+# $change_user - the username to be recorded for the Mercurial commit
+# $change_date - the date to be recorded for the Mercurial commit (yyyy-mm-dd hh:mm:ss format)
+# @change_description - the commit message to be used in Mercurial, as a list of lines of text
+#
+# The lines in the change description should not contain end of line markers, as these will be supplied
+# by the main code.
+#
+sub scm_checkout($)
+ {
+ my ($scmref) = @_;
+
+ my @change_description;
+ my $change_date;
+ my $change_user;
+
+ # obtain the user , date and description for the given change identifier
+
+ # apply the change to the workspace, ready for Mercurial to deduce with "hg commit --addremove"
+
+ return ($change_user,$change_date,@change_description);
+ }
+
+
+# scm_checkin($hgnode,$author,$date,$changes,$description,$tags)
+#
+# Describe the changes to the workspace as an SCM change, and return the new identifier (for use in a tag)
+#
+# The function receives 6 parameters, all of which are associated with the Mercurial commit
+#
+# $hgnode - Mercurial commit reference, as a globally unique hexadecimal identifier
+# $author - the author recorded in the commit
+# $date - the date recorded in the commit, in ISO date format (yyyy-mm-dd hh:mm:ss)
+# $changes - Perl reference to the list of file changes (more information below)
+# $description - Perl reference to the list of lines in the commit message
+# $tags - Perl reference to the list of (non-local) tags associated with this commit
+#
+# The changes come from the Mercurial "hg status" command, and consist of a filename relative to the
+# root of the repository, prefixed by a single letter code and a space. The codes that this routine
+# must handle are M = modify, R = remove, A = add, and C = clean. The C codes are only used for the
+# first synchronisation, and so should be handled as "add if not already in XXX". All of the implied
+# changes have already been applied to the files in the workspace - the R files have been deleted,
+# the A files have been added and the M files contain the desired content.
+#
+# The $hgnode should be recorded in the description in the XXX system, as should the $author and $date if
+# they can't be used directly.
+#
+# The function returns the identifier for the completed change, which will be tagged in the Mercurial
+# repository and reported to scm_init() in future synchronisation runs.
+#
+# WARNING: The tag information isn't currently filtered properly, and it is likely that there will
+# need to be a separate scm_tag() function to handle the important Mercurial tags explicitly. Don't try
+# to do much with the tag information just yet.
+#
+sub scm_checkin($$$$$$)
+ {
+ my ($hgnode,$author,$date,$changes,$description,$tags) = @_;
+
+ my @hg_tags = grep !/^tip$/, split /\s+/, $tags;
+ my @xxx_modify;
+ my @xxx_remove;
+ my @xxx_add;
+
+ # Separate the changes into lists of files for modify/add/remove
+
+ foreach my $line (@$changes)
+ {
+ my $type = substr($line,0,2,""); # removes type as well as extracting it
+ if ($type eq "M ")
+ {
+ push @xxx_modify, $line;
+ next;
+ }
+ if ($type eq "A " || $type eq "C ")
+ {
+ push @xxx_add, $line;
+ next;
+ }
+ if ($type eq "R ")
+ {
+ push @xxx_remove, $line;
+ next;
+ }
+
+ abandon_sync("Unexpected hg status line: $type$line");
+ }
+
+ # Create an XXX system change object to record the changes (if necessary)
+ # process the lists of files
+
+ if (scalar @xxx_add)
+ {
+ # add the files in the xxx_add list
+ }
+
+ if (scalar @xxx_modify)
+ {
+ # process the list of modified files
+ }
+
+ if (scalar @xxx_remove)
+ {
+ # remove the files in the xxx_remove list
+ }
+
+ # Create the change description from the @$description list
+
+ # Include the $hgnode as part of the description
+ # Use the $author and $date if possible (by might just have to be more descriptive text
+ # TODO: Do something with the interesting tags?
+
+ my $scmref = some_function();
+
+ return $scmref;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/synch_hg_p4/update_repos.pl Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,71 @@
+#! perl
+
+use strict;
+
+# update_repos.pl
+
+my %repos;
+
+foreach my $layer ("os", "mw", "app", "ostools")
+ {
+ opendir DIR, $layer;
+ my @packages = grep !/^\.\.?$/, readdir DIR;
+ closedir DIR;
+ foreach my $package (@packages)
+ {
+ next if (-f "$layer/$package");
+ $repos{"$layer/$package"} = 1;
+ }
+ }
+
+print join("\n",sort keys %repos,"","");
+
+my $tree = "d:/Mercurial/";
+
+foreach my $layer ("os", "mw", "app", "ostools")
+ {
+ opendir DIR, "$tree$layer";
+ my @packages = grep !/^\.\.?$/, readdir DIR;
+ closedir DIR;
+ foreach my $package (@packages)
+ {
+ next if (-f "$tree$package");
+ if (defined $repos{"$layer/$package"})
+ {
+ # this one is still relevant
+ next;
+ }
+ # package name has changed, I expect
+ print "Old package $layer/$package is now obsolete\n";
+ rename "$tree$layer/$package", "$tree"."obsolete/".$package;
+ }
+ }
+
+foreach my $repo (sort keys %repos)
+ {
+ print "\n\nProcessing $repo\n";
+ my ($layer,$package) = split /\//, $repo;
+ my $master = "$tree$repo/MCL_$package/.hg";
+
+ if (-d $master)
+ {
+ # repo already exists - move it into place
+ rename "$tree$repo/MCL_$package/.hg", "$repo/.hg";
+ }
+ else
+ {
+ # New repo
+ print "New repository $repo\n";
+ mkdir "$tree$layer";
+ mkdir "$tree$layer/$package";
+ mkdir "$tree$layer/$package/MCL_$package";
+ }
+
+ chdir $repo;
+ system("hg init") if (!-d ".hg");
+ system("hg", "commit", "--addremove", "-m", "add wk04 Nokia source");
+ chdir "../..";
+ rename "$repo/.hg", "$tree$repo/MCL_$package/.hg";
+ }
+
+
\ No newline at end of file