//
// 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
*/
}
|