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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="IfAction.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.    
  23.     internal class IfAction : ContainerAction
  24.     {
  25.         internal enum ConditionType
  26.         {
  27.             ConditionIf,
  28.             ConditionWhen,
  29.             ConditionOtherwise
  30.         }
  31.        
  32.         private ConditionType type;
  33.         private int testKey = Compiler.InvalidQueryKey;
  34.        
  35.         internal IfAction(ConditionType type)
  36.         {
  37.             this.type = type;
  38.         }
  39.        
  40.         internal override void Compile(Compiler compiler)
  41.         {
  42.             CompileAttributes(compiler);
  43.             if (this.type != ConditionType.ConditionOtherwise) {
  44.                 CheckRequiredAttribute(compiler, this.testKey != Compiler.InvalidQueryKey, Keywords.s_Test);
  45.             }
  46.            
  47.             if (compiler.Recurse()) {
  48.                 CompileTemplate(compiler);
  49.                 compiler.ToParent();
  50.             }
  51.         }
  52.        
  53.         internal override bool CompileAttribute(Compiler compiler)
  54.         {
  55.             string name = compiler.Input.LocalName;
  56.             string value = compiler.Input.Value;
  57.             if (Keywords.Equals(name, compiler.Atoms.Test)) {
  58.                 if (this.type == ConditionType.ConditionOtherwise) {
  59.                     return false;
  60.                 }
  61.                 this.testKey = compiler.AddBooleanQuery(value);
  62.             }
  63.             else {
  64.                 return false;
  65.             }
  66.            
  67.             return true;
  68.         }
  69.        
  70.         internal override void Execute(Processor processor, ActionFrame frame)
  71.         {
  72.             Debug.Assert(processor != null && frame != null);
  73.            
  74.             switch (frame.State) {
  75.                 case Initialized:
  76.                     if (this.type == ConditionType.ConditionIf || this.type == ConditionType.ConditionWhen) {
  77.                         Debug.Assert(this.testKey != Compiler.InvalidQueryKey);
  78.                         bool value = processor.EvaluateBoolean(frame, this.testKey);
  79.                         if (value == false) {
  80.                             frame.Finished();
  81.                             break;
  82.                         }
  83.                     }
  84.                    
  85.                     processor.PushActionFrame(frame);
  86.                     frame.State = ProcessingChildren;
  87.                     break;
  88.                 case ProcessingChildren:
  89.                     // Allow children to run
  90.                     if (this.type == ConditionType.ConditionWhen || this.type == ConditionType.ConditionOtherwise) {
  91.                         Debug.Assert(frame.Container != null);
  92.                         frame.Exit();
  93.                     }
  94.                    
  95.                     frame.Finished();
  96.                     break;
  97.                 default:
  98.                    
  99.                     Debug.Fail("Invalid IfAction execution state");
  100.                     break;
  101.             }
  102.         }
  103.     }
  104. }

Developer Fusion