Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Data.SqlXml / System / Xml / Xsl / XsltOld / CopyNamespacesAction.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="CopyNamespacesAction.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 sealed class CopyNamespacesAction : Action {
16         private const int BeginEvent    = 2;
17         private const int TextEvent     = 3;
18         private const int EndEvent      = 4;
19         private const int Advance       = 5;
20
21         private static CopyNamespacesAction s_Action = new CopyNamespacesAction();
22
23         internal static CopyNamespacesAction GetAction() {
24             Debug.Assert(s_Action != null);
25             return s_Action;
26         }
27
28         internal override void Execute(Processor processor, ActionFrame frame) {
29             Debug.Assert(processor != null && frame != null);
30
31             while (processor.CanContinue) {
32                 switch (frame.State) {
33                 case Initialized:
34                     if (frame.Node.MoveToFirstNamespace(XPathNamespaceScope.ExcludeXml) == false) {
35                         frame.Finished();
36                         break;
37                     }
38
39                     frame.State   = BeginEvent;
40                     goto case BeginEvent;
41
42                 case BeginEvent:
43                     Debug.Assert(frame.State == BeginEvent);
44                     Debug.Assert(frame.Node.NodeType == XPathNodeType.Namespace);
45
46                     if (processor.BeginEvent(XPathNodeType.Namespace, null, frame.Node.LocalName, frame.Node.Value, false) == false) {
47                         // This one wasn't output
48                         break;
49                     }
50                     frame.State = EndEvent;
51                     continue;
52
53                 case EndEvent:
54                     Debug.Assert(frame.State == EndEvent);
55                     Debug.Assert(frame.Node.NodeType == XPathNodeType.Namespace);
56
57                     if (processor.EndEvent(XPathNodeType.Namespace) == false) {
58                         // This one wasn't output
59                         break;
60                     }
61                     frame.State = Advance;
62                     continue;
63
64                 case Advance:
65                     Debug.Assert(frame.State == Advance);
66                     Debug.Assert(frame.Node.NodeType == XPathNodeType.Namespace);
67
68                     if (frame.Node.MoveToNextNamespace(XPathNamespaceScope.ExcludeXml)) {
69                         frame.State = BeginEvent;
70                         continue;
71                     }
72                     else {
73                         frame.Node.MoveToParent();
74                         frame.Finished();
75                         break;
76                     }
77                 }
78                 break;
79             }// while
80         }
81     }
82 }