Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Data.SqlXml / System / Xml / Xsl / XsltOld / CallTemplateAction.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="CallTemplateAction.cs" company="Microsoft">
3 //     Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>                                                                
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
7
8 namespace System.Xml.Xsl.XsltOld {
9     using Res = System.Xml.Utils.Res;
10     using System;
11     using System.Diagnostics;
12     using System.Xml;
13     using System.Xml.XPath;
14
15     internal class CallTemplateAction : ContainerAction {
16         private const int        ProcessedChildren = 2;
17         private const int        ProcessedTemplate = 3;
18         private XmlQualifiedName name;
19         
20         internal override void Compile(Compiler compiler) {
21             CompileAttributes(compiler);
22             CheckRequiredAttribute(compiler, this.name, "name");
23             CompileContent(compiler);
24         }
25
26         internal override bool CompileAttribute(Compiler compiler) {
27             string name   = compiler.Input.LocalName;
28             string value  = compiler.Input.Value;
29             if (Ref.Equal(name, compiler.Atoms.Name)) {
30                 Debug.Assert(this.name == null);
31                 this.name = compiler.CreateXPathQName(value);
32             }
33             else {
34                 return false;
35             }
36
37             return true;
38         }
39
40         private void CompileContent(Compiler compiler) {
41             NavigatorInput input = compiler.Input;
42             
43             if (compiler.Recurse()) {
44                 do {
45                     switch(input.NodeType) {
46                     case XPathNodeType.Element:
47                         compiler.PushNamespaceScope();
48                         string nspace = input.NamespaceURI;
49                         string name   = input.LocalName;
50
51                         if (Ref.Equal(nspace, input.Atoms.UriXsl) && Ref.Equal(name, input.Atoms.WithParam)) {
52                                 WithParamAction par = compiler.CreateWithParamAction();
53                                 CheckDuplicateParams(par.Name);
54                                 AddAction(par);
55                         }
56                         else {
57                             throw compiler.UnexpectedKeyword();
58                         }
59                         compiler.PopScope();
60                         break;
61                     case XPathNodeType.Comment:
62                     case XPathNodeType.ProcessingInstruction:
63                     case XPathNodeType.Whitespace:
64                     case XPathNodeType.SignificantWhitespace:
65                         break;
66                     default:
67                         throw XsltException.Create(Res.Xslt_InvalidContents, "call-template");
68                     }
69                 } while(compiler.Advance());
70
71                 compiler.ToParent();
72             }
73         }
74
75         internal override void Execute(Processor processor, ActionFrame frame) {
76             Debug.Assert(processor != null && frame != null);
77             switch(frame.State) {
78             case Initialized : 
79                 processor.ResetParams();
80                 if (this.containedActions != null && this.containedActions.Count > 0) {
81                     processor.PushActionFrame(frame);
82                     frame.State = ProcessedChildren;
83                     break;
84                 }
85                 goto case ProcessedChildren;
86             case ProcessedChildren:
87                 TemplateAction action = processor.Stylesheet.FindTemplate(this.name);
88                 if (action != null) { 
89                     frame.State = ProcessedTemplate;
90                     processor.PushActionFrame(action, frame.NodeSet);
91                     break;
92                 }
93                 else {
94                     throw XsltException.Create(Res.Xslt_InvalidCallTemplate, this.name.ToString());
95                 }
96             case ProcessedTemplate:
97                 frame.Finished();
98                 break;
99             default:
100                 Debug.Fail("Invalid CallTemplateAction execution state");
101                 break;
102             }
103         }
104     }
105 }