コード例 #1
0
 internal BsonBinaryWriterContext(
     BsonBinaryWriterContext parentContext,
     BsonWriteState writeState
 )
 {
     this.parentContext = parentContext;
     this.writeState = writeState;
 }
コード例 #2
0
 public BsonBinaryWriter(
     Stream stream,
     BsonBuffer buffer,
     BsonBinaryWriterSettings settings
 ) {
     this.stream = stream;
     this.buffer = buffer ?? new BsonBuffer();
     this.disposeBuffer = buffer == null; // only call Dispose if we allocated the buffer
     this.settings = settings;
     context = new BsonBinaryWriterContext(null, BsonWriteState.Initial);
 }
コード例 #3
0
 public override void Close() {
     // Close can be called on Disposed objects
     if (context.WriteState != BsonWriteState.Closed) {
         if (context.WriteState == BsonWriteState.Done) {
             Flush();
         }
         if (stream != null && settings.CloseOutput) {
             stream.Close();
         }
         context = new BsonBinaryWriterContext(null, BsonWriteState.Closed);
     }
 }
コード例 #4
0
 public override void WriteArrayName(
     string name
 ) {
     if (disposed) { throw new ObjectDisposedException("BsonBinaryWriter"); }
     if ((context.WriteState & BsonWriteState.Document) == 0) {
         throw new InvalidOperationException("WriteStartArray can only be called when WriteState is one of the document states");
     }
     buffer.WriteByte((byte) BsonType.Array);
     buffer.WriteCString(name);
     context = new BsonBinaryWriterContext(context, BsonWriteState.Array);
     context = new BsonBinaryWriterContext(context, BsonWriteState.StartDocument);
 }
コード例 #5
0
 public override void WriteStartDocument() {
     if (disposed) { throw new ObjectDisposedException("BsonBinaryWriter"); }
     if (context.WriteState == BsonWriteState.StartDocument) {
         context = context.ParentContext;
     } else if (context.WriteState == BsonWriteState.Initial || context.WriteState == BsonWriteState.Done) {
         context = new BsonBinaryWriterContext(context, BsonWriteState.Document);
     } else {
         throw new InvalidOperationException("WriteStartDocument can only be called when WriteState is Initial, StartDocument, or Done");
     }
     context.StartPosition = buffer.Position;
     buffer.WriteInt32(0); // reserve space for size
 }
コード例 #6
0
 public override void WriteJavaScriptWithScope(
     string name,
     string code
 ) {
     if (disposed) { throw new ObjectDisposedException("BsonBinaryWriter"); }
     if ((context.WriteState & BsonWriteState.Document) == 0) {
         throw new InvalidOperationException("WriteStartJavaScriptWithScope can only be called when WriteState is one of the document states");
     }
     buffer.WriteByte((byte) BsonType.JavaScriptWithScope);
     buffer.WriteCString(name);
     context = new BsonBinaryWriterContext(context, BsonWriteState.JavaScriptWithScope);
     context.StartPosition = buffer.Position;
     buffer.WriteInt32(0); // reserve space for size of JavaScript with scope value
     buffer.WriteString(code);
     context = new BsonBinaryWriterContext(context, BsonWriteState.ScopeDocument);
     context = new BsonBinaryWriterContext(context, BsonWriteState.StartDocument);
 }
コード例 #7
0
        public override void WriteEndDocument() {
            if (disposed) { throw new ObjectDisposedException("BsonBinaryWriter"); }
            if ((context.WriteState & BsonWriteState.Document) == 0) {
                throw new InvalidOperationException("WriteEndDocument can only be called when WriteState is one of the document states");
            }
            buffer.WriteByte(0);
            BackpatchSize(); // size of document
            context = context.ParentContext;

            if (context.WriteState == BsonWriteState.JavaScriptWithScope) {
                BackpatchSize(); // size of the JavaScript with scope value
                context = context.ParentContext;
            }

            if (context.WriteState == BsonWriteState.Initial) {
                context = new BsonBinaryWriterContext(null, BsonWriteState.Done);
            }
        }