File: XmlBinaryFormat.cs

package info (click to toggle)
mono 2.6.7-5.1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 327,344 kB
  • ctags: 413,649
  • sloc: cs: 2,471,883; xml: 1,768,594; ansic: 350,665; sh: 13,644; makefile: 8,640; perl: 1,784; asm: 717; cpp: 209; python: 146; sql: 81; sed: 16
file content (181 lines) | stat: -rw-r--r-- 6,186 bytes parent folder | download | duplicates (5)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//
// XmlBinaryFormat.cs
//
// Author:
//	Atsushi Enomoto  <atsushi@ximian.com>
//
// Copyright (C) 2007 Novell, Inc.  http://www.novell.com
//

//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;

namespace System.Xml
{
	internal class XmlBinaryFormat
	{
		public const byte EndElement = 0x01;
		public const byte Comment = 0x02;
		public const byte Array = 0x03;
		public const byte AttrString = 0x04;
		public const byte AttrStringPrefix = 0x05;
		public const byte AttrIndex = 0x06;
		public const byte AttrIndexPrefix = 0x07;
		public const byte DefaultNSString = 0x08;
		public const byte PrefixNSString = 0x09;
		public const byte DefaultNSIndex = 0x0A;
		public const byte PrefixNSIndex = 0x0B;
		public const byte PrefixNAttrIndexStart = 0x0C;
		public const byte PrefixNAttrIndexEnd = 0x0C + 26 - 1;
		public const byte PrefixNAttrStringStart = 0x26;
		public const byte PrefixNAttrStringEnd = 0x26 + 26 - 1;
		public const byte ElemString = 0x40;
		public const byte ElemStringPrefix = 0x41;
		public const byte ElemIndex = 0x42;
		public const byte ElemIndexPrefix = 0x43;
		public const byte PrefixNElemIndexStart = 0x44;
		public const byte PrefixNElemIndexEnd = 0x44 + 26 - 1;
		public const byte PrefixNElemStringStart = 0x5E;
		public const byte PrefixNElemStringEnd = 0x5E + 26 - 1;

		public const byte Zero = 0x80;
		public const byte One = 0x82;
		public const byte BoolFalse = 0x84;
		public const byte BoolTrue = 0x86;
		public const byte Int8 = 0x88;
		public const byte Int16 = 0x8A;
		public const byte Int32 = 0x8C;
		public const byte Int64 = 0x8E;
		public const byte Single = 0x90;
		public const byte Double = 0x92;
		public const byte Decimal = 0x94;
		public const byte DateTime = 0x96;
		public const byte Chars8 = 0x98;
		public const byte Chars16 = 0x9A;
		public const byte Chars32 = 0x9C;
		public const byte Bytes8 = 0x9E;
		public const byte Bytes16 = 0xA0;
		public const byte Bytes32 = 0xA2;

		public const byte EmptyText = 0xA8;
		public const byte TextIndex = 0xAA;
		public const byte UniqueId = 0xAC;
		public const byte TimeSpan = 0xAE;
		public const byte Guid = 0xB0;
		public const byte UInt64 = 0xB2;
		public const byte Bool = 0xB4; // e.g. for typed array
		public const byte Utf16_8 = 0xB6;
		public const byte Utf16_16 = 0xB8;
		public const byte Utf16_32 = 0xBA;
		public const byte QNameIndex = 0xBC;
	}

	/* Binary Format (incomplete):

		Literal strings are represented as UTF-8 string, with a length
		prefixed to the string itself.

		Key indices are based on the rules below:
		- dictionary strings which can be found in IXmlDictionary are 
		  doubled its Key. e.g. if the string.Key is 4, then the
		  output is 8.
		- dictionary strings which cannot be found in IXmlDictionary
		  are stored in the XmlBinaryWriterSession, and its output
		  number is doubled + 1 e.g. if the string is the first
		  non-dictionary entry, then the output is 1, and 7 for the
		  fourth one.
		- When the index goes beyond 128, then it becomes 2 bytes,
		  where the first byte becomes 0x80 + idx % 0x80 and
		  the second byte becomes idx / 0x80.

		Below are operations. Prefixes are always raw strings.
		$string is length-prefixed string. @index is index as
		described above. [value] is length-prefixed raw array.

		// 2009-03-25: now that the binary format is open under OSP
		// [MC-NBFX], I have added some notes beyond current
		// implementation status (marked as TODO).

		01			: EndElement
		02 $value		: Comment
		03			: array
		04 $name		: local attribute by string
		05 $prefix $name	: global attribute by string
		06 @name		: local attribute by index
		07 $prefix @name	: global attribute by index
		08 $name		: default namespace by string
		09 $prefix $name	: prefixed namespace by string
		0A @name		: default namespace by index
		0B $prefix @name	: prefixed namespace by index
		0C @name		: global attribute by index,
		... 0x25		: in current element's namespace
		26 ... 0x3F		: attributes with prefix
		40 $name		: element w/o namespace by string
		41 $prefix $name	: element with namespace by string
		42 @name		: element w/o namespace by index
		43 $prefix @name	: element with namespace by index
		44 @name		: global element by index,
		... 0x5D		: in current element's namespace
		5E ... 0x77		: elements with prefix
		98 $value		: text/cdata/chars
		99 $value		: text/cdata/chars + EndElement

		FIXME: Below are not implemented:
		(Uri is simply 98, QName is 98 '{' ns '}' 98 name)

		Combined EndElement for below are supported:
		80 : 0 (integer)
		82 : 1 (integer)
		84 : false (bool)
		86 : true (bool)
		88 : 1-byte integer
		8A : 2-bytes integer
		8C : 4-bytes integer
		8E : 8-bytes integer
		90 : single
		92 : double
		94 : decimal
		96 : DateTime
		98 : chars8
		9A : chars16
		9C : chars32
		9E : bytes8 (base64)
		A0 : bytes16 (base64)
		A2 : bytes32 (base64)
		A4 : TODO: start of list
		A6 : TODO: end of list
		A8 : empty text
		AA : text index
		AC : UniqueId (IsGuid = true)
		AE : TimeSpan
		B0 : UUID
		B2 : UInt64
		B4 : bool text
		B6 : utf16_8
		B8 : utf16_16
		BA : utf16_32
		BC : QName index

		Error: PIs, doctype
		Ignored: XMLdecl
	*/
}