chore: 初始化北汽福田MES采集程序
This commit is contained in:
44
Common/00-1Json8.3/Json8.3/Bson/BsonBinaryType.cs
Normal file
44
Common/00-1Json8.3/Json8.3/Bson/BsonBinaryType.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// 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.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
|
||||
namespace Newtonsoft.Json.Bson
|
||||
{
|
||||
internal enum BsonBinaryType : byte
|
||||
{
|
||||
Binary = 0x00,
|
||||
Function = 0x01,
|
||||
|
||||
[Obsolete("This type has been deprecated in the BSON specification. Use Binary instead.")]
|
||||
BinaryOld = 0x02,
|
||||
|
||||
[Obsolete("This type has been deprecated in the BSON specification. Use Uuid instead.")]
|
||||
UuidOld = 0x03,
|
||||
Uuid = 0x04,
|
||||
Md5 = 0x05,
|
||||
UserDefined = 0x80
|
||||
}
|
||||
}
|
||||
331
Common/00-1Json8.3/Json8.3/Bson/BsonBinaryWriter.cs
Normal file
331
Common/00-1Json8.3/Json8.3/Bson/BsonBinaryWriter.cs
Normal file
@@ -0,0 +1,331 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// 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.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json.Utilities;
|
||||
|
||||
namespace Newtonsoft.Json.Bson
|
||||
{
|
||||
internal class BsonBinaryWriter
|
||||
{
|
||||
private static readonly Encoding Encoding = new UTF8Encoding(false);
|
||||
|
||||
private readonly BinaryWriter _writer;
|
||||
|
||||
private byte[] _largeByteBuffer;
|
||||
|
||||
public DateTimeKind DateTimeKindHandling { get; set; }
|
||||
|
||||
public BsonBinaryWriter(BinaryWriter writer)
|
||||
{
|
||||
DateTimeKindHandling = DateTimeKind.Utc;
|
||||
_writer = writer;
|
||||
}
|
||||
|
||||
public void Flush()
|
||||
{
|
||||
_writer.Flush();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
#if !(DOTNET || PORTABLE40 || PORTABLE)
|
||||
_writer.Close();
|
||||
#else
|
||||
_writer.Dispose();
|
||||
#endif
|
||||
}
|
||||
|
||||
public void WriteToken(BsonToken t)
|
||||
{
|
||||
CalculateSize(t);
|
||||
WriteTokenInternal(t);
|
||||
}
|
||||
|
||||
private void WriteTokenInternal(BsonToken t)
|
||||
{
|
||||
switch (t.Type)
|
||||
{
|
||||
case BsonType.Object:
|
||||
{
|
||||
BsonObject value = (BsonObject)t;
|
||||
_writer.Write(value.CalculatedSize);
|
||||
foreach (BsonProperty property in value)
|
||||
{
|
||||
_writer.Write((sbyte)property.Value.Type);
|
||||
WriteString((string)property.Name.Value, property.Name.ByteCount, null);
|
||||
WriteTokenInternal(property.Value);
|
||||
}
|
||||
_writer.Write((byte)0);
|
||||
}
|
||||
break;
|
||||
case BsonType.Array:
|
||||
{
|
||||
BsonArray value = (BsonArray)t;
|
||||
_writer.Write(value.CalculatedSize);
|
||||
ulong index = 0;
|
||||
foreach (BsonToken c in value)
|
||||
{
|
||||
_writer.Write((sbyte)c.Type);
|
||||
WriteString(index.ToString(CultureInfo.InvariantCulture), MathUtils.IntLength(index), null);
|
||||
WriteTokenInternal(c);
|
||||
index++;
|
||||
}
|
||||
_writer.Write((byte)0);
|
||||
}
|
||||
break;
|
||||
case BsonType.Integer:
|
||||
{
|
||||
BsonValue value = (BsonValue)t;
|
||||
_writer.Write(Convert.ToInt32(value.Value, CultureInfo.InvariantCulture));
|
||||
}
|
||||
break;
|
||||
case BsonType.Long:
|
||||
{
|
||||
BsonValue value = (BsonValue)t;
|
||||
_writer.Write(Convert.ToInt64(value.Value, CultureInfo.InvariantCulture));
|
||||
}
|
||||
break;
|
||||
case BsonType.Number:
|
||||
{
|
||||
BsonValue value = (BsonValue)t;
|
||||
_writer.Write(Convert.ToDouble(value.Value, CultureInfo.InvariantCulture));
|
||||
}
|
||||
break;
|
||||
case BsonType.String:
|
||||
{
|
||||
BsonString value = (BsonString)t;
|
||||
WriteString((string)value.Value, value.ByteCount, value.CalculatedSize - 4);
|
||||
}
|
||||
break;
|
||||
case BsonType.Boolean:
|
||||
{
|
||||
BsonValue value = (BsonValue)t;
|
||||
_writer.Write((bool)value.Value);
|
||||
}
|
||||
break;
|
||||
case BsonType.Null:
|
||||
case BsonType.Undefined:
|
||||
break;
|
||||
case BsonType.Date:
|
||||
{
|
||||
BsonValue value = (BsonValue)t;
|
||||
|
||||
long ticks = 0;
|
||||
|
||||
if (value.Value is DateTime)
|
||||
{
|
||||
DateTime dateTime = (DateTime)value.Value;
|
||||
if (DateTimeKindHandling == DateTimeKind.Utc)
|
||||
{
|
||||
dateTime = dateTime.ToUniversalTime();
|
||||
}
|
||||
else if (DateTimeKindHandling == DateTimeKind.Local)
|
||||
{
|
||||
dateTime = dateTime.ToLocalTime();
|
||||
}
|
||||
|
||||
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(dateTime, false);
|
||||
}
|
||||
#if !NET20
|
||||
else
|
||||
{
|
||||
DateTimeOffset dateTimeOffset = (DateTimeOffset)value.Value;
|
||||
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(dateTimeOffset.UtcDateTime, dateTimeOffset.Offset);
|
||||
}
|
||||
#endif
|
||||
|
||||
_writer.Write(ticks);
|
||||
}
|
||||
break;
|
||||
case BsonType.Binary:
|
||||
{
|
||||
BsonBinary value = (BsonBinary)t;
|
||||
|
||||
byte[] data = (byte[])value.Value;
|
||||
_writer.Write(data.Length);
|
||||
_writer.Write((byte)value.BinaryType);
|
||||
_writer.Write(data);
|
||||
}
|
||||
break;
|
||||
case BsonType.Oid:
|
||||
{
|
||||
BsonValue value = (BsonValue)t;
|
||||
|
||||
byte[] data = (byte[])value.Value;
|
||||
_writer.Write(data);
|
||||
}
|
||||
break;
|
||||
case BsonType.Regex:
|
||||
{
|
||||
BsonRegex value = (BsonRegex)t;
|
||||
|
||||
WriteString((string)value.Pattern.Value, value.Pattern.ByteCount, null);
|
||||
WriteString((string)value.Options.Value, value.Options.ByteCount, null);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(t), "Unexpected token when writing BSON: {0}".FormatWith(CultureInfo.InvariantCulture, t.Type));
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteString(string s, int byteCount, int? calculatedlengthPrefix)
|
||||
{
|
||||
if (calculatedlengthPrefix != null)
|
||||
{
|
||||
_writer.Write(calculatedlengthPrefix.GetValueOrDefault());
|
||||
}
|
||||
|
||||
WriteUtf8Bytes(s, byteCount);
|
||||
|
||||
_writer.Write((byte)0);
|
||||
}
|
||||
|
||||
public void WriteUtf8Bytes(string s, int byteCount)
|
||||
{
|
||||
if (s != null)
|
||||
{
|
||||
if (_largeByteBuffer == null)
|
||||
{
|
||||
_largeByteBuffer = new byte[256];
|
||||
}
|
||||
if (byteCount <= 256)
|
||||
{
|
||||
Encoding.GetBytes(s, 0, s.Length, _largeByteBuffer, 0);
|
||||
_writer.Write(_largeByteBuffer, 0, byteCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
byte[] bytes = Encoding.GetBytes(s);
|
||||
_writer.Write(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int CalculateSize(int stringByteCount)
|
||||
{
|
||||
return stringByteCount + 1;
|
||||
}
|
||||
|
||||
private int CalculateSizeWithLength(int stringByteCount, bool includeSize)
|
||||
{
|
||||
int baseSize = (includeSize)
|
||||
? 5 // size bytes + terminator
|
||||
: 1; // terminator
|
||||
|
||||
return baseSize + stringByteCount;
|
||||
}
|
||||
|
||||
private int CalculateSize(BsonToken t)
|
||||
{
|
||||
switch (t.Type)
|
||||
{
|
||||
case BsonType.Object:
|
||||
{
|
||||
BsonObject value = (BsonObject)t;
|
||||
|
||||
int bases = 4;
|
||||
foreach (BsonProperty p in value)
|
||||
{
|
||||
int size = 1;
|
||||
size += CalculateSize(p.Name);
|
||||
size += CalculateSize(p.Value);
|
||||
|
||||
bases += size;
|
||||
}
|
||||
bases += 1;
|
||||
value.CalculatedSize = bases;
|
||||
return bases;
|
||||
}
|
||||
case BsonType.Array:
|
||||
{
|
||||
BsonArray value = (BsonArray)t;
|
||||
|
||||
int size = 4;
|
||||
ulong index = 0;
|
||||
foreach (BsonToken c in value)
|
||||
{
|
||||
size += 1;
|
||||
size += CalculateSize(MathUtils.IntLength(index));
|
||||
size += CalculateSize(c);
|
||||
index++;
|
||||
}
|
||||
size += 1;
|
||||
value.CalculatedSize = size;
|
||||
|
||||
return value.CalculatedSize;
|
||||
}
|
||||
case BsonType.Integer:
|
||||
return 4;
|
||||
case BsonType.Long:
|
||||
return 8;
|
||||
case BsonType.Number:
|
||||
return 8;
|
||||
case BsonType.String:
|
||||
{
|
||||
BsonString value = (BsonString)t;
|
||||
string s = (string)value.Value;
|
||||
value.ByteCount = (s != null) ? Encoding.GetByteCount(s) : 0;
|
||||
value.CalculatedSize = CalculateSizeWithLength(value.ByteCount, value.IncludeLength);
|
||||
|
||||
return value.CalculatedSize;
|
||||
}
|
||||
case BsonType.Boolean:
|
||||
return 1;
|
||||
case BsonType.Null:
|
||||
case BsonType.Undefined:
|
||||
return 0;
|
||||
case BsonType.Date:
|
||||
return 8;
|
||||
case BsonType.Binary:
|
||||
{
|
||||
BsonBinary value = (BsonBinary)t;
|
||||
|
||||
byte[] data = (byte[])value.Value;
|
||||
value.CalculatedSize = 4 + 1 + data.Length;
|
||||
|
||||
return value.CalculatedSize;
|
||||
}
|
||||
case BsonType.Oid:
|
||||
return 12;
|
||||
case BsonType.Regex:
|
||||
{
|
||||
BsonRegex value = (BsonRegex)t;
|
||||
int size = 0;
|
||||
size += CalculateSize(value.Pattern);
|
||||
size += CalculateSize(value.Options);
|
||||
value.CalculatedSize = size;
|
||||
|
||||
return value.CalculatedSize;
|
||||
}
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(t), "Unexpected token when writing BSON: {0}".FormatWith(CultureInfo.InvariantCulture, t.Type));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
57
Common/00-1Json8.3/Json8.3/Bson/BsonObjectId.cs
Normal file
57
Common/00-1Json8.3/Json8.3/Bson/BsonObjectId.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// 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.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using Newtonsoft.Json.Utilities;
|
||||
|
||||
namespace Newtonsoft.Json.Bson
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a BSON Oid (object id).
|
||||
/// </summary>
|
||||
public class BsonObjectId
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the value of the Oid.
|
||||
/// </summary>
|
||||
/// <value>The value of the Oid.</value>
|
||||
public byte[] Value { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BsonObjectId"/> class.
|
||||
/// </summary>
|
||||
/// <param name="value">The Oid value.</param>
|
||||
public BsonObjectId(byte[] value)
|
||||
{
|
||||
ValidationUtils.ArgumentNotNull(value, nameof(value));
|
||||
if (value.Length != 12)
|
||||
{
|
||||
throw new ArgumentException("An ObjectId must be 12 bytes", nameof(value));
|
||||
}
|
||||
|
||||
Value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
827
Common/00-1Json8.3/Json8.3/Bson/BsonReader.cs
Normal file
827
Common/00-1Json8.3/Json8.3/Bson/BsonReader.cs
Normal file
@@ -0,0 +1,827 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// 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.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
using Newtonsoft.Json.Utilities;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace Newtonsoft.Json.Bson
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data.
|
||||
/// </summary>
|
||||
public class BsonReader : JsonReader
|
||||
{
|
||||
private const int MaxCharBytesSize = 128;
|
||||
private static readonly byte[] SeqRange1 = new byte[] { 0, 127 }; // range of 1-byte sequence
|
||||
private static readonly byte[] SeqRange2 = new byte[] { 194, 223 }; // range of 2-byte sequence
|
||||
private static readonly byte[] SeqRange3 = new byte[] { 224, 239 }; // range of 3-byte sequence
|
||||
private static readonly byte[] SeqRange4 = new byte[] { 240, 244 }; // range of 4-byte sequence
|
||||
|
||||
private readonly BinaryReader _reader;
|
||||
private readonly List<ContainerContext> _stack;
|
||||
|
||||
private byte[] _byteBuffer;
|
||||
private char[] _charBuffer;
|
||||
|
||||
private BsonType _currentElementType;
|
||||
private BsonReaderState _bsonReaderState;
|
||||
private ContainerContext _currentContext;
|
||||
|
||||
private bool _readRootValueAsArray;
|
||||
private bool _jsonNet35BinaryCompatibility;
|
||||
private DateTimeKind _dateTimeKindHandling;
|
||||
|
||||
private enum BsonReaderState
|
||||
{
|
||||
Normal = 0,
|
||||
ReferenceStart = 1,
|
||||
ReferenceRef = 2,
|
||||
ReferenceId = 3,
|
||||
CodeWScopeStart = 4,
|
||||
CodeWScopeCode = 5,
|
||||
CodeWScopeScope = 6,
|
||||
CodeWScopeScopeObject = 7,
|
||||
CodeWScopeScopeEnd = 8
|
||||
}
|
||||
|
||||
private class ContainerContext
|
||||
{
|
||||
public readonly BsonType Type;
|
||||
public int Length;
|
||||
public int Position;
|
||||
|
||||
public ContainerContext(BsonType type)
|
||||
{
|
||||
Type = type;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary.
|
||||
/// </summary>
|
||||
/// <value>
|
||||
/// <c>true</c> if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, <c>false</c>.
|
||||
/// </value>
|
||||
[Obsolete("JsonNet35BinaryCompatibility will be removed in a future version of Json.NET.")]
|
||||
public bool JsonNet35BinaryCompatibility
|
||||
{
|
||||
get { return _jsonNet35BinaryCompatibility; }
|
||||
set { _jsonNet35BinaryCompatibility = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the root object will be read as a JSON array.
|
||||
/// </summary>
|
||||
/// <value>
|
||||
/// <c>true</c> if the root object will be read as a JSON array; otherwise, <c>false</c>.
|
||||
/// </value>
|
||||
public bool ReadRootValueAsArray
|
||||
{
|
||||
get { return _readRootValueAsArray; }
|
||||
set { _readRootValueAsArray = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the <see cref="DateTimeKind" /> used when reading <see cref="DateTime"/> values from BSON.
|
||||
/// </summary>
|
||||
/// <value>The <see cref="DateTimeKind" /> used when reading <see cref="DateTime"/> values from BSON.</value>
|
||||
public DateTimeKind DateTimeKindHandling
|
||||
{
|
||||
get { return _dateTimeKindHandling; }
|
||||
set { _dateTimeKindHandling = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BsonReader"/> class.
|
||||
/// </summary>
|
||||
/// <param name="stream">The stream.</param>
|
||||
public BsonReader(Stream stream)
|
||||
: this(stream, false, DateTimeKind.Local)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BsonReader"/> class.
|
||||
/// </summary>
|
||||
/// <param name="reader">The reader.</param>
|
||||
public BsonReader(BinaryReader reader)
|
||||
: this(reader, false, DateTimeKind.Local)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BsonReader"/> class.
|
||||
/// </summary>
|
||||
/// <param name="stream">The stream.</param>
|
||||
/// <param name="readRootValueAsArray">if set to <c>true</c> the root object will be read as a JSON array.</param>
|
||||
/// <param name="dateTimeKindHandling">The <see cref="DateTimeKind" /> used when reading <see cref="DateTime"/> values from BSON.</param>
|
||||
public BsonReader(Stream stream, bool readRootValueAsArray, DateTimeKind dateTimeKindHandling)
|
||||
{
|
||||
ValidationUtils.ArgumentNotNull(stream, nameof(stream));
|
||||
_reader = new BinaryReader(stream);
|
||||
_stack = new List<ContainerContext>();
|
||||
_readRootValueAsArray = readRootValueAsArray;
|
||||
_dateTimeKindHandling = dateTimeKindHandling;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BsonReader"/> class.
|
||||
/// </summary>
|
||||
/// <param name="reader">The reader.</param>
|
||||
/// <param name="readRootValueAsArray">if set to <c>true</c> the root object will be read as a JSON array.</param>
|
||||
/// <param name="dateTimeKindHandling">The <see cref="DateTimeKind" /> used when reading <see cref="DateTime"/> values from BSON.</param>
|
||||
public BsonReader(BinaryReader reader, bool readRootValueAsArray, DateTimeKind dateTimeKindHandling)
|
||||
{
|
||||
ValidationUtils.ArgumentNotNull(reader, nameof(reader));
|
||||
_reader = reader;
|
||||
_stack = new List<ContainerContext>();
|
||||
_readRootValueAsArray = readRootValueAsArray;
|
||||
_dateTimeKindHandling = dateTimeKindHandling;
|
||||
}
|
||||
|
||||
private string ReadElement()
|
||||
{
|
||||
_currentElementType = ReadType();
|
||||
string elementName = ReadString();
|
||||
return elementName;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads the next JSON token from the stream.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// true if the next token was read successfully; false if there are no more tokens to read.
|
||||
/// </returns>
|
||||
public override bool Read()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool success;
|
||||
|
||||
switch (_bsonReaderState)
|
||||
{
|
||||
case BsonReaderState.Normal:
|
||||
success = ReadNormal();
|
||||
break;
|
||||
case BsonReaderState.ReferenceStart:
|
||||
case BsonReaderState.ReferenceRef:
|
||||
case BsonReaderState.ReferenceId:
|
||||
success = ReadReference();
|
||||
break;
|
||||
case BsonReaderState.CodeWScopeStart:
|
||||
case BsonReaderState.CodeWScopeCode:
|
||||
case BsonReaderState.CodeWScopeScope:
|
||||
case BsonReaderState.CodeWScopeScopeObject:
|
||||
case BsonReaderState.CodeWScopeScopeEnd:
|
||||
success = ReadCodeWScope();
|
||||
break;
|
||||
default:
|
||||
throw JsonReaderException.Create(this, "Unexpected state: {0}".FormatWith(CultureInfo.InvariantCulture, _bsonReaderState));
|
||||
}
|
||||
|
||||
if (!success)
|
||||
{
|
||||
SetToken(JsonToken.None);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (EndOfStreamException)
|
||||
{
|
||||
SetToken(JsonToken.None);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Changes the <see cref="JsonReader.State"/> to Closed.
|
||||
/// </summary>
|
||||
public override void Close()
|
||||
{
|
||||
base.Close();
|
||||
|
||||
if (CloseInput && _reader != null)
|
||||
{
|
||||
#if !(DOTNET || PORTABLE40 || PORTABLE)
|
||||
_reader.Close();
|
||||
#else
|
||||
_reader.Dispose();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
private bool ReadCodeWScope()
|
||||
{
|
||||
switch (_bsonReaderState)
|
||||
{
|
||||
case BsonReaderState.CodeWScopeStart:
|
||||
SetToken(JsonToken.PropertyName, "$code");
|
||||
_bsonReaderState = BsonReaderState.CodeWScopeCode;
|
||||
return true;
|
||||
case BsonReaderState.CodeWScopeCode:
|
||||
// total CodeWScope size - not used
|
||||
ReadInt32();
|
||||
|
||||
SetToken(JsonToken.String, ReadLengthString());
|
||||
_bsonReaderState = BsonReaderState.CodeWScopeScope;
|
||||
return true;
|
||||
case BsonReaderState.CodeWScopeScope:
|
||||
if (CurrentState == State.PostValue)
|
||||
{
|
||||
SetToken(JsonToken.PropertyName, "$scope");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetToken(JsonToken.StartObject);
|
||||
_bsonReaderState = BsonReaderState.CodeWScopeScopeObject;
|
||||
|
||||
ContainerContext newContext = new ContainerContext(BsonType.Object);
|
||||
PushContext(newContext);
|
||||
newContext.Length = ReadInt32();
|
||||
|
||||
return true;
|
||||
}
|
||||
case BsonReaderState.CodeWScopeScopeObject:
|
||||
bool result = ReadNormal();
|
||||
if (result && TokenType == JsonToken.EndObject)
|
||||
{
|
||||
_bsonReaderState = BsonReaderState.CodeWScopeScopeEnd;
|
||||
}
|
||||
|
||||
return result;
|
||||
case BsonReaderState.CodeWScopeScopeEnd:
|
||||
SetToken(JsonToken.EndObject);
|
||||
_bsonReaderState = BsonReaderState.Normal;
|
||||
return true;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
private bool ReadReference()
|
||||
{
|
||||
switch (CurrentState)
|
||||
{
|
||||
case State.ObjectStart:
|
||||
{
|
||||
SetToken(JsonToken.PropertyName, JsonTypeReflector.RefPropertyName);
|
||||
_bsonReaderState = BsonReaderState.ReferenceRef;
|
||||
return true;
|
||||
}
|
||||
case State.Property:
|
||||
{
|
||||
if (_bsonReaderState == BsonReaderState.ReferenceRef)
|
||||
{
|
||||
SetToken(JsonToken.String, ReadLengthString());
|
||||
return true;
|
||||
}
|
||||
else if (_bsonReaderState == BsonReaderState.ReferenceId)
|
||||
{
|
||||
SetToken(JsonToken.Bytes, ReadBytes(12));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + _bsonReaderState);
|
||||
}
|
||||
}
|
||||
case State.PostValue:
|
||||
{
|
||||
if (_bsonReaderState == BsonReaderState.ReferenceRef)
|
||||
{
|
||||
SetToken(JsonToken.PropertyName, JsonTypeReflector.IdPropertyName);
|
||||
_bsonReaderState = BsonReaderState.ReferenceId;
|
||||
return true;
|
||||
}
|
||||
else if (_bsonReaderState == BsonReaderState.ReferenceId)
|
||||
{
|
||||
SetToken(JsonToken.EndObject);
|
||||
_bsonReaderState = BsonReaderState.Normal;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + _bsonReaderState);
|
||||
}
|
||||
}
|
||||
default:
|
||||
throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + CurrentState);
|
||||
}
|
||||
}
|
||||
|
||||
private bool ReadNormal()
|
||||
{
|
||||
switch (CurrentState)
|
||||
{
|
||||
case State.Start:
|
||||
{
|
||||
JsonToken token = (!_readRootValueAsArray) ? JsonToken.StartObject : JsonToken.StartArray;
|
||||
BsonType type = (!_readRootValueAsArray) ? BsonType.Object : BsonType.Array;
|
||||
|
||||
SetToken(token);
|
||||
ContainerContext newContext = new ContainerContext(type);
|
||||
PushContext(newContext);
|
||||
newContext.Length = ReadInt32();
|
||||
return true;
|
||||
}
|
||||
case State.Complete:
|
||||
case State.Closed:
|
||||
return false;
|
||||
case State.Property:
|
||||
{
|
||||
ReadType(_currentElementType);
|
||||
return true;
|
||||
}
|
||||
case State.ObjectStart:
|
||||
case State.ArrayStart:
|
||||
case State.PostValue:
|
||||
ContainerContext context = _currentContext;
|
||||
if (context == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int lengthMinusEnd = context.Length - 1;
|
||||
|
||||
if (context.Position < lengthMinusEnd)
|
||||
{
|
||||
if (context.Type == BsonType.Array)
|
||||
{
|
||||
ReadElement();
|
||||
ReadType(_currentElementType);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetToken(JsonToken.PropertyName, ReadElement());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (context.Position == lengthMinusEnd)
|
||||
{
|
||||
if (ReadByte() != 0)
|
||||
{
|
||||
throw JsonReaderException.Create(this, "Unexpected end of object byte value.");
|
||||
}
|
||||
|
||||
PopContext();
|
||||
if (_currentContext != null)
|
||||
{
|
||||
MovePosition(context.Length);
|
||||
}
|
||||
|
||||
JsonToken endToken = (context.Type == BsonType.Object) ? JsonToken.EndObject : JsonToken.EndArray;
|
||||
SetToken(endToken);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw JsonReaderException.Create(this, "Read past end of current container context.");
|
||||
}
|
||||
case State.ConstructorStart:
|
||||
break;
|
||||
case State.Constructor:
|
||||
break;
|
||||
case State.Error:
|
||||
break;
|
||||
case State.Finished:
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void PopContext()
|
||||
{
|
||||
_stack.RemoveAt(_stack.Count - 1);
|
||||
if (_stack.Count == 0)
|
||||
{
|
||||
_currentContext = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
_currentContext = _stack[_stack.Count - 1];
|
||||
}
|
||||
}
|
||||
|
||||
private void PushContext(ContainerContext newContext)
|
||||
{
|
||||
_stack.Add(newContext);
|
||||
_currentContext = newContext;
|
||||
}
|
||||
|
||||
private byte ReadByte()
|
||||
{
|
||||
MovePosition(1);
|
||||
return _reader.ReadByte();
|
||||
}
|
||||
|
||||
private void ReadType(BsonType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case BsonType.Number:
|
||||
double d = ReadDouble();
|
||||
|
||||
if (_floatParseHandling == FloatParseHandling.Decimal)
|
||||
{
|
||||
SetToken(JsonToken.Float, Convert.ToDecimal(d, CultureInfo.InvariantCulture));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetToken(JsonToken.Float, d);
|
||||
}
|
||||
break;
|
||||
case BsonType.String:
|
||||
case BsonType.Symbol:
|
||||
SetToken(JsonToken.String, ReadLengthString());
|
||||
break;
|
||||
case BsonType.Object:
|
||||
{
|
||||
SetToken(JsonToken.StartObject);
|
||||
|
||||
ContainerContext newContext = new ContainerContext(BsonType.Object);
|
||||
PushContext(newContext);
|
||||
newContext.Length = ReadInt32();
|
||||
break;
|
||||
}
|
||||
case BsonType.Array:
|
||||
{
|
||||
SetToken(JsonToken.StartArray);
|
||||
|
||||
ContainerContext newContext = new ContainerContext(BsonType.Array);
|
||||
PushContext(newContext);
|
||||
newContext.Length = ReadInt32();
|
||||
break;
|
||||
}
|
||||
case BsonType.Binary:
|
||||
BsonBinaryType binaryType;
|
||||
byte[] data = ReadBinary(out binaryType);
|
||||
|
||||
object value = (binaryType != BsonBinaryType.Uuid)
|
||||
? data
|
||||
: (object)new Guid(data);
|
||||
|
||||
SetToken(JsonToken.Bytes, value);
|
||||
break;
|
||||
case BsonType.Undefined:
|
||||
SetToken(JsonToken.Undefined);
|
||||
break;
|
||||
case BsonType.Oid:
|
||||
byte[] oid = ReadBytes(12);
|
||||
SetToken(JsonToken.Bytes, oid);
|
||||
break;
|
||||
case BsonType.Boolean:
|
||||
bool b = Convert.ToBoolean(ReadByte());
|
||||
SetToken(JsonToken.Boolean, b);
|
||||
break;
|
||||
case BsonType.Date:
|
||||
long ticks = ReadInt64();
|
||||
DateTime utcDateTime = DateTimeUtils.ConvertJavaScriptTicksToDateTime(ticks);
|
||||
|
||||
DateTime dateTime;
|
||||
switch (DateTimeKindHandling)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
dateTime = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Unspecified);
|
||||
break;
|
||||
case DateTimeKind.Local:
|
||||
dateTime = utcDateTime.ToLocalTime();
|
||||
break;
|
||||
default:
|
||||
dateTime = utcDateTime;
|
||||
break;
|
||||
}
|
||||
|
||||
SetToken(JsonToken.Date, dateTime);
|
||||
break;
|
||||
case BsonType.Null:
|
||||
SetToken(JsonToken.Null);
|
||||
break;
|
||||
case BsonType.Regex:
|
||||
string expression = ReadString();
|
||||
string modifiers = ReadString();
|
||||
|
||||
string regex = @"/" + expression + @"/" + modifiers;
|
||||
SetToken(JsonToken.String, regex);
|
||||
break;
|
||||
case BsonType.Reference:
|
||||
SetToken(JsonToken.StartObject);
|
||||
_bsonReaderState = BsonReaderState.ReferenceStart;
|
||||
break;
|
||||
case BsonType.Code:
|
||||
SetToken(JsonToken.String, ReadLengthString());
|
||||
break;
|
||||
case BsonType.CodeWScope:
|
||||
SetToken(JsonToken.StartObject);
|
||||
_bsonReaderState = BsonReaderState.CodeWScopeStart;
|
||||
break;
|
||||
case BsonType.Integer:
|
||||
SetToken(JsonToken.Integer, (long)ReadInt32());
|
||||
break;
|
||||
case BsonType.TimeStamp:
|
||||
case BsonType.Long:
|
||||
SetToken(JsonToken.Integer, ReadInt64());
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), "Unexpected BsonType value: " + type);
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] ReadBinary(out BsonBinaryType binaryType)
|
||||
{
|
||||
int dataLength = ReadInt32();
|
||||
|
||||
binaryType = (BsonBinaryType)ReadByte();
|
||||
|
||||
#pragma warning disable 612,618
|
||||
// the old binary type has the data length repeated in the data for some reason
|
||||
if (binaryType == BsonBinaryType.BinaryOld && !_jsonNet35BinaryCompatibility)
|
||||
{
|
||||
dataLength = ReadInt32();
|
||||
}
|
||||
#pragma warning restore 612,618
|
||||
|
||||
return ReadBytes(dataLength);
|
||||
}
|
||||
|
||||
private string ReadString()
|
||||
{
|
||||
EnsureBuffers();
|
||||
|
||||
StringBuilder builder = null;
|
||||
|
||||
int totalBytesRead = 0;
|
||||
// used in case of left over multibyte characters in the buffer
|
||||
int offset = 0;
|
||||
while (true)
|
||||
{
|
||||
int count = offset;
|
||||
byte b;
|
||||
while (count < MaxCharBytesSize && (b = _reader.ReadByte()) > 0)
|
||||
{
|
||||
_byteBuffer[count++] = b;
|
||||
}
|
||||
int byteCount = count - offset;
|
||||
totalBytesRead += byteCount;
|
||||
|
||||
if (count < MaxCharBytesSize && builder == null)
|
||||
{
|
||||
// pref optimization to avoid reading into a string builder
|
||||
// if string is smaller than the buffer then return it directly
|
||||
int length = Encoding.UTF8.GetChars(_byteBuffer, 0, byteCount, _charBuffer, 0);
|
||||
|
||||
MovePosition(totalBytesRead + 1);
|
||||
return new string(_charBuffer, 0, length);
|
||||
}
|
||||
else
|
||||
{
|
||||
// calculate the index of the end of the last full character in the buffer
|
||||
int lastFullCharStop = GetLastFullCharStop(count - 1);
|
||||
|
||||
int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, lastFullCharStop + 1, _charBuffer, 0);
|
||||
|
||||
if (builder == null)
|
||||
{
|
||||
builder = new StringBuilder(MaxCharBytesSize * 2);
|
||||
}
|
||||
|
||||
builder.Append(_charBuffer, 0, charCount);
|
||||
|
||||
if (lastFullCharStop < byteCount - 1)
|
||||
{
|
||||
offset = byteCount - lastFullCharStop - 1;
|
||||
// copy left over multi byte characters to beginning of buffer for next iteration
|
||||
Array.Copy(_byteBuffer, lastFullCharStop + 1, _byteBuffer, 0, offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
// reached end of string
|
||||
if (count < MaxCharBytesSize)
|
||||
{
|
||||
MovePosition(totalBytesRead + 1);
|
||||
return builder.ToString();
|
||||
}
|
||||
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string ReadLengthString()
|
||||
{
|
||||
int length = ReadInt32();
|
||||
|
||||
MovePosition(length);
|
||||
|
||||
string s = GetString(length - 1);
|
||||
_reader.ReadByte();
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
private string GetString(int length)
|
||||
{
|
||||
if (length == 0)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
EnsureBuffers();
|
||||
|
||||
StringBuilder builder = null;
|
||||
|
||||
int totalBytesRead = 0;
|
||||
|
||||
// used in case of left over multibyte characters in the buffer
|
||||
int offset = 0;
|
||||
do
|
||||
{
|
||||
int count = ((length - totalBytesRead) > MaxCharBytesSize - offset)
|
||||
? MaxCharBytesSize - offset
|
||||
: length - totalBytesRead;
|
||||
|
||||
int byteCount = _reader.Read(_byteBuffer, offset, count);
|
||||
|
||||
if (byteCount == 0)
|
||||
{
|
||||
throw new EndOfStreamException("Unable to read beyond the end of the stream.");
|
||||
}
|
||||
|
||||
totalBytesRead += byteCount;
|
||||
|
||||
// Above, byteCount is how many bytes we read this time.
|
||||
// Below, byteCount is how many bytes are in the _byteBuffer.
|
||||
byteCount += offset;
|
||||
|
||||
if (byteCount == length)
|
||||
{
|
||||
// pref optimization to avoid reading into a string builder
|
||||
// first iteration and all bytes read then return string directly
|
||||
int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, byteCount, _charBuffer, 0);
|
||||
return new string(_charBuffer, 0, charCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
int lastFullCharStop = GetLastFullCharStop(byteCount - 1);
|
||||
|
||||
if (builder == null)
|
||||
{
|
||||
builder = new StringBuilder(length);
|
||||
}
|
||||
|
||||
int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, lastFullCharStop + 1, _charBuffer, 0);
|
||||
builder.Append(_charBuffer, 0, charCount);
|
||||
|
||||
if (lastFullCharStop < byteCount - 1)
|
||||
{
|
||||
offset = byteCount - lastFullCharStop - 1;
|
||||
// copy left over multi byte characters to beginning of buffer for next iteration
|
||||
Array.Copy(_byteBuffer, lastFullCharStop + 1, _byteBuffer, 0, offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
} while (totalBytesRead < length);
|
||||
|
||||
return builder.ToString();
|
||||
}
|
||||
|
||||
private int GetLastFullCharStop(int start)
|
||||
{
|
||||
int lookbackPos = start;
|
||||
int bis = 0;
|
||||
while (lookbackPos >= 0)
|
||||
{
|
||||
bis = BytesInSequence(_byteBuffer[lookbackPos]);
|
||||
if (bis == 0)
|
||||
{
|
||||
lookbackPos--;
|
||||
continue;
|
||||
}
|
||||
else if (bis == 1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
lookbackPos--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bis == start - lookbackPos)
|
||||
{
|
||||
//Full character.
|
||||
return start;
|
||||
}
|
||||
else
|
||||
{
|
||||
return lookbackPos;
|
||||
}
|
||||
}
|
||||
|
||||
private int BytesInSequence(byte b)
|
||||
{
|
||||
if (b <= SeqRange1[1])
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (b >= SeqRange2[0] && b <= SeqRange2[1])
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
if (b >= SeqRange3[0] && b <= SeqRange3[1])
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
if (b >= SeqRange4[0] && b <= SeqRange4[1])
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void EnsureBuffers()
|
||||
{
|
||||
if (_byteBuffer == null)
|
||||
{
|
||||
_byteBuffer = new byte[MaxCharBytesSize];
|
||||
}
|
||||
if (_charBuffer == null)
|
||||
{
|
||||
int charBufferSize = Encoding.UTF8.GetMaxCharCount(MaxCharBytesSize);
|
||||
_charBuffer = new char[charBufferSize];
|
||||
}
|
||||
}
|
||||
|
||||
private double ReadDouble()
|
||||
{
|
||||
MovePosition(8);
|
||||
return _reader.ReadDouble();
|
||||
}
|
||||
|
||||
private int ReadInt32()
|
||||
{
|
||||
MovePosition(4);
|
||||
return _reader.ReadInt32();
|
||||
}
|
||||
|
||||
private long ReadInt64()
|
||||
{
|
||||
MovePosition(8);
|
||||
return _reader.ReadInt64();
|
||||
}
|
||||
|
||||
private BsonType ReadType()
|
||||
{
|
||||
MovePosition(1);
|
||||
return (BsonType)_reader.ReadSByte();
|
||||
}
|
||||
|
||||
private void MovePosition(int count)
|
||||
{
|
||||
_currentContext.Position += count;
|
||||
}
|
||||
|
||||
private byte[] ReadBytes(int count)
|
||||
{
|
||||
MovePosition(count);
|
||||
return _reader.ReadBytes(count);
|
||||
}
|
||||
}
|
||||
}
|
||||
157
Common/00-1Json8.3/Json8.3/Bson/BsonToken.cs
Normal file
157
Common/00-1Json8.3/Json8.3/Bson/BsonToken.cs
Normal file
@@ -0,0 +1,157 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// 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.
|
||||
#endregion
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Newtonsoft.Json.Bson
|
||||
{
|
||||
internal abstract class BsonToken
|
||||
{
|
||||
public abstract BsonType Type { get; }
|
||||
public BsonToken Parent { get; set; }
|
||||
public int CalculatedSize { get; set; }
|
||||
}
|
||||
|
||||
internal class BsonObject : BsonToken, IEnumerable<BsonProperty>
|
||||
{
|
||||
private readonly List<BsonProperty> _children = new List<BsonProperty>();
|
||||
|
||||
public void Add(string name, BsonToken token)
|
||||
{
|
||||
_children.Add(new BsonProperty { Name = new BsonString(name, false), Value = token });
|
||||
token.Parent = this;
|
||||
}
|
||||
|
||||
public override BsonType Type
|
||||
{
|
||||
get { return BsonType.Object; }
|
||||
}
|
||||
|
||||
public IEnumerator<BsonProperty> GetEnumerator()
|
||||
{
|
||||
return _children.GetEnumerator();
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return GetEnumerator();
|
||||
}
|
||||
}
|
||||
|
||||
internal class BsonArray : BsonToken, IEnumerable<BsonToken>
|
||||
{
|
||||
private readonly List<BsonToken> _children = new List<BsonToken>();
|
||||
|
||||
public void Add(BsonToken token)
|
||||
{
|
||||
_children.Add(token);
|
||||
token.Parent = this;
|
||||
}
|
||||
|
||||
public override BsonType Type
|
||||
{
|
||||
get { return BsonType.Array; }
|
||||
}
|
||||
|
||||
public IEnumerator<BsonToken> GetEnumerator()
|
||||
{
|
||||
return _children.GetEnumerator();
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return GetEnumerator();
|
||||
}
|
||||
}
|
||||
|
||||
internal class BsonValue : BsonToken
|
||||
{
|
||||
private readonly object _value;
|
||||
private readonly BsonType _type;
|
||||
|
||||
public BsonValue(object value, BsonType type)
|
||||
{
|
||||
_value = value;
|
||||
_type = type;
|
||||
}
|
||||
|
||||
public object Value
|
||||
{
|
||||
get { return _value; }
|
||||
}
|
||||
|
||||
public override BsonType Type
|
||||
{
|
||||
get { return _type; }
|
||||
}
|
||||
}
|
||||
|
||||
internal class BsonString : BsonValue
|
||||
{
|
||||
public int ByteCount { get; set; }
|
||||
public bool IncludeLength { get; set; }
|
||||
|
||||
public BsonString(object value, bool includeLength)
|
||||
: base(value, BsonType.String)
|
||||
{
|
||||
IncludeLength = includeLength;
|
||||
}
|
||||
}
|
||||
|
||||
internal class BsonBinary : BsonValue
|
||||
{
|
||||
public BsonBinaryType BinaryType { get; set; }
|
||||
|
||||
public BsonBinary(byte[] value, BsonBinaryType binaryType)
|
||||
: base(value, BsonType.Binary)
|
||||
{
|
||||
BinaryType = binaryType;
|
||||
}
|
||||
}
|
||||
|
||||
internal class BsonRegex : BsonToken
|
||||
{
|
||||
public BsonString Pattern { get; set; }
|
||||
public BsonString Options { get; set; }
|
||||
|
||||
public BsonRegex(string pattern, string options)
|
||||
{
|
||||
Pattern = new BsonString(pattern, false);
|
||||
Options = new BsonString(options, false);
|
||||
}
|
||||
|
||||
public override BsonType Type
|
||||
{
|
||||
get { return BsonType.Regex; }
|
||||
}
|
||||
}
|
||||
|
||||
internal class BsonProperty
|
||||
{
|
||||
public BsonString Name { get; set; }
|
||||
public BsonToken Value { get; set; }
|
||||
}
|
||||
}
|
||||
51
Common/00-1Json8.3/Json8.3/Bson/BsonType.cs
Normal file
51
Common/00-1Json8.3/Json8.3/Bson/BsonType.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// 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.
|
||||
#endregion
|
||||
|
||||
namespace Newtonsoft.Json.Bson
|
||||
{
|
||||
internal enum BsonType : sbyte
|
||||
{
|
||||
Number = 1,
|
||||
String = 2,
|
||||
Object = 3,
|
||||
Array = 4,
|
||||
Binary = 5,
|
||||
Undefined = 6,
|
||||
Oid = 7,
|
||||
Boolean = 8,
|
||||
Date = 9,
|
||||
Null = 10,
|
||||
Regex = 11,
|
||||
Reference = 12,
|
||||
Code = 13,
|
||||
Symbol = 14,
|
||||
CodeWScope = 15,
|
||||
Integer = 16,
|
||||
TimeStamp = 17,
|
||||
Long = 18,
|
||||
MinKey = -1,
|
||||
MaxKey = 127
|
||||
}
|
||||
}
|
||||
531
Common/00-1Json8.3/Json8.3/Bson/BsonWriter.cs
Normal file
531
Common/00-1Json8.3/Json8.3/Bson/BsonWriter.cs
Normal file
@@ -0,0 +1,531 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// 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.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
#if !(NET20 || NET35 || PORTABLE40 || PORTABLE)
|
||||
using System.Numerics;
|
||||
#endif
|
||||
using System.Text;
|
||||
using Newtonsoft.Json.Utilities;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Newtonsoft.Json.Bson
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data.
|
||||
/// </summary>
|
||||
public class BsonWriter : JsonWriter
|
||||
{
|
||||
private readonly BsonBinaryWriter _writer;
|
||||
|
||||
private BsonToken _root;
|
||||
private BsonToken _parent;
|
||||
private string _propertyName;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the <see cref="DateTimeKind" /> used when writing <see cref="DateTime"/> values to BSON.
|
||||
/// When set to <see cref="DateTimeKind.Unspecified" /> no conversion will occur.
|
||||
/// </summary>
|
||||
/// <value>The <see cref="DateTimeKind" /> used when writing <see cref="DateTime"/> values to BSON.</value>
|
||||
public DateTimeKind DateTimeKindHandling
|
||||
{
|
||||
get { return _writer.DateTimeKindHandling; }
|
||||
set { _writer.DateTimeKindHandling = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BsonWriter"/> class.
|
||||
/// </summary>
|
||||
/// <param name="stream">The stream.</param>
|
||||
public BsonWriter(Stream stream)
|
||||
{
|
||||
ValidationUtils.ArgumentNotNull(stream, nameof(stream));
|
||||
_writer = new BsonBinaryWriter(new BinaryWriter(stream));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BsonWriter"/> class.
|
||||
/// </summary>
|
||||
/// <param name="writer">The writer.</param>
|
||||
public BsonWriter(BinaryWriter writer)
|
||||
{
|
||||
ValidationUtils.ArgumentNotNull(writer, nameof(writer));
|
||||
_writer = new BsonBinaryWriter(writer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
|
||||
/// </summary>
|
||||
public override void Flush()
|
||||
{
|
||||
_writer.Flush();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the end.
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
protected override void WriteEnd(JsonToken token)
|
||||
{
|
||||
base.WriteEnd(token);
|
||||
RemoveParent();
|
||||
|
||||
if (Top == 0)
|
||||
{
|
||||
_writer.WriteToken(_root);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes out a comment <code>/*...*/</code> containing the specified text.
|
||||
/// </summary>
|
||||
/// <param name="text">Text to place inside the comment.</param>
|
||||
public override void WriteComment(string text)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "Cannot write JSON comment as BSON.", null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the start of a constructor with the given name.
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the constructor.</param>
|
||||
public override void WriteStartConstructor(string name)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "Cannot write JSON constructor as BSON.", null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes raw JSON.
|
||||
/// </summary>
|
||||
/// <param name="json">The raw JSON to write.</param>
|
||||
public override void WriteRaw(string json)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "Cannot write raw JSON as BSON.", null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes raw JSON where a value is expected and updates the writer's state.
|
||||
/// </summary>
|
||||
/// <param name="json">The raw JSON to write.</param>
|
||||
public override void WriteRawValue(string json)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "Cannot write raw JSON as BSON.", null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the beginning of a JSON array.
|
||||
/// </summary>
|
||||
public override void WriteStartArray()
|
||||
{
|
||||
base.WriteStartArray();
|
||||
|
||||
AddParent(new BsonArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the beginning of a JSON object.
|
||||
/// </summary>
|
||||
public override void WriteStartObject()
|
||||
{
|
||||
base.WriteStartObject();
|
||||
|
||||
AddParent(new BsonObject());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the property name of a name/value pair on a JSON object.
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the property.</param>
|
||||
public override void WritePropertyName(string name)
|
||||
{
|
||||
base.WritePropertyName(name);
|
||||
|
||||
_propertyName = name;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes this stream and the underlying stream.
|
||||
/// </summary>
|
||||
public override void Close()
|
||||
{
|
||||
base.Close();
|
||||
|
||||
if (CloseOutput && _writer != null)
|
||||
{
|
||||
_writer.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void AddParent(BsonToken container)
|
||||
{
|
||||
AddToken(container);
|
||||
_parent = container;
|
||||
}
|
||||
|
||||
private void RemoveParent()
|
||||
{
|
||||
_parent = _parent.Parent;
|
||||
}
|
||||
|
||||
private void AddValue(object value, BsonType type)
|
||||
{
|
||||
AddToken(new BsonValue(value, type));
|
||||
}
|
||||
|
||||
internal void AddToken(BsonToken token)
|
||||
{
|
||||
if (_parent != null)
|
||||
{
|
||||
if (_parent is BsonObject)
|
||||
{
|
||||
((BsonObject)_parent).Add(_propertyName, token);
|
||||
_propertyName = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
((BsonArray)_parent).Add(token);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (token.Type != BsonType.Object && token.Type != BsonType.Array)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "Error writing {0} value. BSON must start with an Object or Array.".FormatWith(CultureInfo.InvariantCulture, token.Type), null);
|
||||
}
|
||||
|
||||
_parent = token;
|
||||
_root = token;
|
||||
}
|
||||
}
|
||||
|
||||
#region WriteValue methods
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Object"/> value.
|
||||
/// An error will raised if the value cannot be written as a single JSON token.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Object"/> value to write.</param>
|
||||
public override void WriteValue(object value)
|
||||
{
|
||||
#if !(NET20 || NET35 || PORTABLE || PORTABLE40)
|
||||
if (value is BigInteger)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
AddToken(new BsonBinary(((BigInteger)value).ToByteArray(), BsonBinaryType.Binary));
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
base.WriteValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a null value.
|
||||
/// </summary>
|
||||
public override void WriteNull()
|
||||
{
|
||||
base.WriteNull();
|
||||
AddValue(null, BsonType.Null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes an undefined value.
|
||||
/// </summary>
|
||||
public override void WriteUndefined()
|
||||
{
|
||||
base.WriteUndefined();
|
||||
AddValue(null, BsonType.Undefined);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="String"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="String"/> value to write.</param>
|
||||
public override void WriteValue(string value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
if (value == null)
|
||||
{
|
||||
AddValue(null, BsonType.Null);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddToken(new BsonString(value, true));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Int32"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Int32"/> value to write.</param>
|
||||
public override void WriteValue(int value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Integer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="UInt32"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="UInt32"/> value to write.</param>
|
||||
[CLSCompliant(false)]
|
||||
public override void WriteValue(uint value)
|
||||
{
|
||||
if (value > int.MaxValue)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "Value is too large to fit in a signed 32 bit integer. BSON does not support unsigned values.", null);
|
||||
}
|
||||
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Integer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Int64"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Int64"/> value to write.</param>
|
||||
public override void WriteValue(long value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Long);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="UInt64"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="UInt64"/> value to write.</param>
|
||||
[CLSCompliant(false)]
|
||||
public override void WriteValue(ulong value)
|
||||
{
|
||||
if (value > long.MaxValue)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "Value is too large to fit in a signed 64 bit integer. BSON does not support unsigned values.", null);
|
||||
}
|
||||
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Long);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Single"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Single"/> value to write.</param>
|
||||
public override void WriteValue(float value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Number);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Double"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Double"/> value to write.</param>
|
||||
public override void WriteValue(double value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Number);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Boolean"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Boolean"/> value to write.</param>
|
||||
public override void WriteValue(bool value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Boolean);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Int16"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Int16"/> value to write.</param>
|
||||
public override void WriteValue(short value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Integer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="UInt16"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="UInt16"/> value to write.</param>
|
||||
[CLSCompliant(false)]
|
||||
public override void WriteValue(ushort value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Integer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Char"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Char"/> value to write.</param>
|
||||
public override void WriteValue(char value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
string s = null;
|
||||
#if !(DOTNET || PORTABLE40 || PORTABLE)
|
||||
s = value.ToString(CultureInfo.InvariantCulture);
|
||||
#else
|
||||
s = value.ToString();
|
||||
#endif
|
||||
AddToken(new BsonString(s, true));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Byte"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Byte"/> value to write.</param>
|
||||
public override void WriteValue(byte value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Integer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="SByte"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="SByte"/> value to write.</param>
|
||||
[CLSCompliant(false)]
|
||||
public override void WriteValue(sbyte value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Integer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Decimal"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Decimal"/> value to write.</param>
|
||||
public override void WriteValue(decimal value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Number);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="DateTime"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="DateTime"/> value to write.</param>
|
||||
public override void WriteValue(DateTime value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
value = DateTimeUtils.EnsureDateTime(value, DateTimeZoneHandling);
|
||||
AddValue(value, BsonType.Date);
|
||||
}
|
||||
|
||||
#if !NET20
|
||||
/// <summary>
|
||||
/// Writes a <see cref="DateTimeOffset"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="DateTimeOffset"/> value to write.</param>
|
||||
public override void WriteValue(DateTimeOffset value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddValue(value, BsonType.Date);
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Byte"/>[] value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Byte"/>[] value to write.</param>
|
||||
public override void WriteValue(byte[] value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddToken(new BsonBinary(value, BsonBinaryType.Binary));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Guid"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Guid"/> value to write.</param>
|
||||
public override void WriteValue(Guid value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddToken(new BsonBinary(value.ToByteArray(), BsonBinaryType.Uuid));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="TimeSpan"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="TimeSpan"/> value to write.</param>
|
||||
public override void WriteValue(TimeSpan value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddToken(new BsonString(value.ToString(), true));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Uri"/> value.
|
||||
/// </summary>
|
||||
/// <param name="value">The <see cref="Uri"/> value to write.</param>
|
||||
public override void WriteValue(Uri value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
AddToken(new BsonString(value.ToString(), true));
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Byte"/>[] value that represents a BSON object id.
|
||||
/// </summary>
|
||||
/// <param name="value">The Object ID value to write.</param>
|
||||
public void WriteObjectId(byte[] value)
|
||||
{
|
||||
ValidationUtils.ArgumentNotNull(value, nameof(value));
|
||||
|
||||
if (value.Length != 12)
|
||||
{
|
||||
throw JsonWriterException.Create(this, "An object id must be 12 bytes", null);
|
||||
}
|
||||
|
||||
// hack to update the writer state
|
||||
UpdateScopeWithFinishedValue();
|
||||
AutoComplete(JsonToken.Undefined);
|
||||
AddValue(value, BsonType.Oid);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a BSON regex.
|
||||
/// </summary>
|
||||
/// <param name="pattern">The regex pattern.</param>
|
||||
/// <param name="options">The regex options.</param>
|
||||
public void WriteRegex(string pattern, string options)
|
||||
{
|
||||
ValidationUtils.ArgumentNotNull(pattern, nameof(pattern));
|
||||
|
||||
// hack to update the writer state
|
||||
UpdateScopeWithFinishedValue();
|
||||
AutoComplete(JsonToken.Undefined);
|
||||
AddToken(new BsonRegex(pattern, options));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user