13
13
* limitations under the License.
14
14
*/
15
15
16
+ using System ;
16
17
using System . IO ;
17
18
18
19
namespace MongoDB . Bson . IO
@@ -35,18 +36,35 @@ public class BsonBinaryReader : BsonReader
35
36
/// <param name="buffer">A BsonBuffer.</param>
36
37
/// <param name="settings">A BsonBinaryReaderSettings.</param>
37
38
public BsonBinaryReader ( BsonBuffer buffer , BsonBinaryReaderSettings settings )
39
+ : this ( buffer ?? new BsonBuffer ( ) , buffer == null , settings )
40
+ {
41
+ }
42
+
43
+ /// <summary>
44
+ /// Initializes a new instance of the BsonBinaryReader class.
45
+ /// </summary>
46
+ /// <param name="buffer">A BsonBuffer.</param>
47
+ /// <param name="disposeBuffer">if set to <c>true</c> this BsonBinaryReader will own the buffer and when Dispose is called the buffer will be Disposed also.</param>
48
+ /// <param name="settings">A BsonBinaryReaderSettings.</param>
49
+ /// <exception cref="System.ArgumentNullException">
50
+ /// buffer
51
+ /// or
52
+ /// settings
53
+ /// </exception>
54
+ public BsonBinaryReader ( BsonBuffer buffer , bool disposeBuffer , BsonBinaryReaderSettings settings )
38
55
: base ( settings )
39
56
{
40
57
if ( buffer == null )
41
58
{
42
- _buffer = new BsonBuffer ( ) ;
43
- _disposeBuffer = true ; // only call Dispose if we allocated the buffer
59
+ throw new ArgumentNullException ( "buffer" ) ;
44
60
}
45
- else
61
+ if ( settings == null )
46
62
{
47
- _buffer = buffer ;
48
- _disposeBuffer = false ;
63
+ throw new ArgumentNullException ( "settings" ) ;
49
64
}
65
+
66
+ _buffer = buffer ;
67
+ _disposeBuffer = disposeBuffer ;
50
68
_binaryReaderSettings = settings ; // already frozen by base class
51
69
_context = new BsonBinaryReaderContext ( null , ContextType . TopLevel , 0 , 0 ) ;
52
70
}
@@ -316,7 +334,7 @@ public override void ReadEndDocument()
316
334
}
317
335
318
336
_context = _context . PopContext ( _buffer . Position ) ;
319
- if ( _context != null && _context . ContextType == ContextType . JavaScriptWithScope )
337
+ if ( _context . ContextType == ContextType . JavaScriptWithScope )
320
338
{
321
339
_context = _context . PopContext ( _buffer . Position ) ; // JavaScriptWithScope
322
340
}
@@ -425,6 +443,64 @@ public override ObjectId ReadObjectId()
425
443
return _buffer . ReadObjectId ( ) ;
426
444
}
427
445
446
+ /// <summary>
447
+ /// Reads a raw BSON array.
448
+ /// </summary>
449
+ /// <returns>
450
+ /// The raw BSON array.
451
+ /// </returns>
452
+ public override IByteBuffer ReadRawBsonArray ( )
453
+ {
454
+ if ( Disposed ) { ThrowObjectDisposedException ( ) ; }
455
+ VerifyBsonType ( "ReadStartArray" , BsonType . Array ) ;
456
+
457
+ var position = _buffer . Position ;
458
+ var length = _buffer . ReadInt32 ( ) ;
459
+ var slice = _buffer . ByteBuffer . GetSlice ( position , length ) ;
460
+ _buffer . Position = position + length ;
461
+
462
+ switch ( _context . ContextType )
463
+ {
464
+ case ContextType . Array : State = BsonReaderState . Type ; break ;
465
+ case ContextType . Document : State = BsonReaderState . Type ; break ;
466
+ case ContextType . TopLevel : State = BsonReaderState . Done ; break ;
467
+ default : throw new BsonInternalException ( "Unexpected ContextType." ) ;
468
+ }
469
+
470
+ return slice ;
471
+ }
472
+
473
+ /// <summary>
474
+ /// Reads a raw BSON document.
475
+ /// </summary>
476
+ /// <returns>
477
+ /// The raw BSON document.
478
+ /// </returns>
479
+ public override IByteBuffer ReadRawBsonDocument ( )
480
+ {
481
+ if ( Disposed ) { ThrowObjectDisposedException ( ) ; }
482
+ VerifyBsonType ( "ReadRawBsonDocument" , BsonType . Document ) ;
483
+
484
+ var position = _buffer . Position ;
485
+ var length = _buffer . ReadInt32 ( ) ;
486
+ var slice = _buffer . ByteBuffer . GetSlice ( position , length ) ;
487
+ _buffer . Position = position + length ;
488
+
489
+ if ( _context . ContextType == ContextType . JavaScriptWithScope )
490
+ {
491
+ _context = _context . PopContext ( _buffer . Position ) ; // JavaScriptWithScope
492
+ }
493
+ switch ( _context . ContextType )
494
+ {
495
+ case ContextType . Array : State = BsonReaderState . Type ; break ;
496
+ case ContextType . Document : State = BsonReaderState . Type ; break ;
497
+ case ContextType . TopLevel : State = BsonReaderState . Done ; break ;
498
+ default : throw new BsonInternalException ( "Unexpected ContextType." ) ;
499
+ }
500
+
501
+ return slice ;
502
+ }
503
+
428
504
/// <summary>
429
505
/// Reads a BSON regular expression from the reader.
430
506
/// </summary>
@@ -597,8 +673,8 @@ protected override void Dispose(bool disposing)
597
673
if ( _disposeBuffer )
598
674
{
599
675
_buffer . Dispose ( ) ;
600
- _buffer = null ;
601
676
}
677
+ _buffer = null ;
602
678
}
603
679
catch { } // ignore exceptions
604
680
}
0 commit comments