blob: 6c0d96591259f0523960fc109e97ad5041778721 (
plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
//
// Mono.Xml.SecurityParser.cs class implementation
//
// Author:
// Sebastien Pouliot (spouliot@motus.com)
//
// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
//
using System;
using System.Collections;
using System.Security;
namespace Mono.Xml {
// convert an XML document into SecurityElement objects
[CLSCompliant(false)]
#if INSIDE_CORLIB
internal
#else
public
#endif
class SecurityParser : MiniParser, MiniParser.IHandler, MiniParser.IReader {
private SecurityElement root;
public SecurityParser () : base ()
{
stack = new Stack ();
}
public void LoadXml (string xml)
{
root = null;
xmldoc = xml;
pos = 0;
stack.Clear ();
Parse (this, this);
}
public SecurityElement ToXml ()
{
return root;
}
// IReader
private string xmldoc;
private int pos;
public int Read ()
{
if (pos >= xmldoc.Length)
return -1;
return (int) xmldoc [pos++];
}
// IHandler
private SecurityElement current;
private Stack stack;
public void OnStartParsing (MiniParser parser) {}
public void OnStartElement (string name, MiniParser.IAttrList attrs)
{
SecurityElement newel = new SecurityElement (name);
if (root == null) {
root = newel;
current = newel;
}
else {
SecurityElement parent = (SecurityElement) stack.Peek ();
parent.AddChild (newel);
}
stack.Push (newel);
current = newel;
// attributes
int n = attrs.Length;
for (int i=0; i < n; i++)
current.AddAttribute (attrs.GetName (i), attrs.GetValue (i));
}
public void OnEndElement (string name)
{
current = (SecurityElement) stack.Pop ();
}
public void OnChars (string ch)
{
current.Text = ch;
}
public void OnEndParsing (MiniParser parser) {}
}
}
|