private bool ReadTextOrValue (byte ident, NodeInfo node, bool canSkip)
{
node.Value = null;
node.ValueType = ident;
node.NodeType = XmlNodeType.Text;
switch (ident) {
case BF.Zero:
node.TypedValue = 0;
break;
case BF.One:
node.TypedValue = 1;
break;
case BF.BoolFalse:
node.TypedValue = false;
break;
case BF.BoolTrue:
node.TypedValue = true;
break;
case BF.Int8:
node.TypedValue = ReadByteOrError ();
break;
case BF.Int16:
node.TypedValue = source.Reader.ReadInt16 ();
break;
case BF.Int32:
node.TypedValue = source.Reader.ReadInt32 ();
break;
case BF.Int64:
node.TypedValue = source.Reader.ReadInt64 ();
break;
case BF.Single:
node.TypedValue = source.Reader.ReadSingle ();
break;
case BF.Double:
node.TypedValue = source.Reader.ReadDouble ();
break;
case BF.Decimal:
int [] bits = new int [4];
bits [3] = source.Reader.ReadInt32 ();
bits [2] = source.Reader.ReadInt32 ();
bits [0] = source.Reader.ReadInt32 ();
bits [1] = source.Reader.ReadInt32 ();
node.TypedValue = new Decimal (bits);
break;
case BF.DateTime:
node.TypedValue = DateTime.FromBinary (source.Reader.ReadInt64 ());
break;
//case BF.UniqueId: // identical to .Text
case BF.Bytes8:
case BF.Bytes16:
case BF.Bytes32:
int size =
(ident == BF.Bytes8) ? source.Reader.ReadByte () :
(ident == BF.Bytes16) ? source.Reader.ReadUInt16 () :
source.Reader.ReadInt32 ();
byte [] base64 = Alloc (size);
source.Reader.Read (base64, 0, base64.Length);
node.TypedValue = base64;
break;
case BF.TimeSpan:
node.TypedValue = new TimeSpan (source.Reader.ReadInt64 ());
break;
case BF.UniqueId:
byte [] guid = new byte [16];
source.Reader.Read (guid, 0, guid.Length);
node.TypedValue = new UniqueId (new Guid (guid));
break;
case BF.Guid:
guid = new byte [16];
source.Reader.Read (guid, 0, guid.Length);
node.TypedValue = new Guid (guid);
break;
case BF.Chars8:
case BF.Chars16:
case BF.Chars32:
case BF.Utf16_8:
case BF.Utf16_16:
case BF.Utf16_32:
Encoding enc = ident <= BF.Chars32 ? Encoding.UTF8 : Encoding.Unicode;
size =
(ident == BF.Chars8 || ident == BF.Utf16_8) ? source.Reader.ReadByte () :
(ident == BF.Chars16 || ident == BF.Utf16_16) ? source.Reader.ReadUInt16 () :
source.Reader.ReadInt32 ();
byte [] bytes = Alloc (size);
source.Reader.Read (bytes, 0, size);
node.Value = enc.GetString (bytes, 0, size);
node.NodeType = XmlNodeType.Text;
break;
case BF.EmptyText:
node.Value = String.Empty;
node.NodeType = XmlNodeType.Text;
break;
case BF.TextIndex:
node.DictValue = ReadDictName ();
node.NodeType = XmlNodeType.Text;
break;
default:
if (!canSkip)
throw new ArgumentException (String.Format ("Unexpected binary XML data at position {1}: {0:X}", ident + (is_next_end_element ? 1 : 0), source.Position));
next = ident;
return false;
}
return true;
}