The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.XsltOld \ CopyAction

  1. //------------------------------------------------------------------------------
  2. // <copyright file="CopyAction.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml.Xsl.XsltOld
  16. {
  17.     using Res = System.Xml.Utils.Res;
  18.     using System;
  19.     using System.Diagnostics;
  20.     using System.Xml;
  21.     using System.Xml.XPath;
  22.     using MS.Internal.Xml.XPath;
  23.    
  24.     internal class CopyAction : ContainerAction
  25.     {
  26.         // Local execution states
  27.         private const int CopyText = 4;
  28.         private const int NamespaceCopy = 5;
  29.        
  30.         private const int ContentsCopy = 6;
  31.         private const int ProcessChildren = 7;
  32.         private const int ChildrenOnly = 8;
  33.        
  34.         private string useAttributeSets;
  35.         private bool empty;
  36.        
  37.         internal override void Compile(Compiler compiler)
  38.         {
  39.             CompileAttributes(compiler);
  40.            
  41.             if (compiler.Recurse()) {
  42.                 CompileTemplate(compiler);
  43.                 compiler.ToParent();
  44.             }
  45.             if (this.containedActions == null)
  46.                 this.empty = true;
  47.            
  48.         }
  49.        
  50.         internal override bool CompileAttribute(Compiler compiler)
  51.         {
  52.             string name = compiler.Input.LocalName;
  53.             string value = compiler.Input.Value;
  54.             if (Keywords.Equals(name, compiler.Atoms.UseAttributeSets)) {
  55.                 this.useAttributeSets = value;
  56.                 AddAction(compiler.CreateUseAttributeSetsAction());
  57.             }
  58.             else {
  59.                 return false;
  60.             }
  61.             return true;
  62.         }
  63.        
  64.         internal override void Execute(Processor processor, ActionFrame frame)
  65.         {
  66.             Debug.Assert(processor != null && frame != null);
  67.            
  68.             while (processor.CanContinue) {
  69.                 switch (frame.State) {
  70.                     case Initialized:
  71.                         if (Processor.IsRoot(frame.Node)) {
  72.                             processor.PushActionFrame(frame);
  73.                             frame.State = ChildrenOnly;
  74.                             break;
  75.                         }
  76.                        
  77.                         if (processor.CopyBeginEvent(frame.Node, this.empty) == false) {
  78.                             // This event wasn't processed
  79.                             break;
  80.                         }
  81.                         frame.State = NamespaceCopy;
  82.                        
  83.                         continue;
  84.                     case NamespaceCopy:
  85.                         frame.State = ContentsCopy;
  86.                         if (frame.Node.NodeType == XPathNodeType.Element) {
  87.                             processor.PushActionFrame(CopyNamespacesAction.GetAction(), frame.NodeSet);
  88.                             break;
  89.                         }
  90.                         continue;
  91.                     case ContentsCopy:
  92.                         if (frame.Node.NodeType == XPathNodeType.Element && !this.empty) {
  93.                             //Debug.Assert(frame.Node.HasValue == false);
  94.                             processor.PushActionFrame(frame);
  95.                             frame.State = ProcessChildren;
  96.                             break;
  97.                         }
  98.                         else {
  99.                             if (processor.CopyTextEvent(frame.Node)) {
  100.                                 frame.State = ProcessChildren;
  101.                                 continue;
  102.                             }
  103.                             else {
  104.                                 // This event wasn't processed
  105.                                 break;
  106.                             }
  107.                         }
  108.                         break;
  109.                     case ProcessChildren:
  110.                        
  111.                         if (processor.CopyEndEvent(frame.Node)) {
  112.                             frame.Finished();
  113.                         }
  114.                         break;
  115.                     case ChildrenOnly:
  116.                        
  117.                         frame.Finished();
  118.                         break;
  119.                     default:
  120.                        
  121.                         Debug.Fail("Invalid CopyAction execution state");
  122.                         break;
  123.                 }
  124.                
  125.                 break;
  126.             }
  127.         }
  128.     }
  129. }

Developer Fusion