Updates referencesource to .NET 4.7
[mono-project.git] / mcs / class / referencesource / System.Data / System / Data / SqlClient / SqlClientWrapperSmiStreamChars.cs
blob1818a2e0c1d8354ca7bb73bf1702589569b34485
1 //------------------------------------------------------------------------------
2 // <copyright file="SqlClientWrapperSmiStream.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
4 // </copyright>
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
9 namespace Microsoft.SqlServer.Server {
10 using System;
11 using System.Data.Common;
12 using System.Data.SqlClient;
13 using System.Data.SqlTypes;
14 using System.Diagnostics;
15 using System.IO;
17 // Simple SqlStreamChars wrapper over SmiStream that handles server events on the
18 // SqlClient side of Smi
19 internal class SqlClientWrapperSmiStreamChars : SqlStreamChars {
21 private SmiEventSink_Default _sink;
22 private SmiStream _stream;
24 internal SqlClientWrapperSmiStreamChars( SmiEventSink_Default sink, SmiStream stream ) {
25 Debug.Assert( null != sink );
26 Debug.Assert( null != stream );
27 _sink = sink;
28 _stream = stream;
31 public override bool IsNull {
32 get {
33 return null == _stream;
37 public override bool CanRead {
38 get {
39 return _stream.CanRead;
43 // If CanSeek is false, Position, Seek, Length, and SetLength should throw.
44 public override bool CanSeek {
45 get {
46 return _stream.CanSeek;
50 public override bool CanWrite {
51 get {
52 return _stream.CanWrite;
56 public override long Length {
57 get {
58 long length = _stream.GetLength( _sink );
59 _sink.ProcessMessagesAndThrow();
60 if ( length > 0 )
61 return length / sizeof( char );
62 else
63 return length;
67 public override long Position {
68 get {
69 long position = _stream.GetPosition( _sink ) / sizeof( char );
70 _sink.ProcessMessagesAndThrow();
71 return position;
73 set {
74 if ( value < 0 ) {
75 throw ADP.ArgumentOutOfRange("Position");
77 _stream.SetPosition( _sink, value * sizeof( char ) );
78 _sink.ProcessMessagesAndThrow();
82 public override void Flush() {
83 _stream.Flush( _sink );
84 _sink.ProcessMessagesAndThrow();
87 public override long Seek(long offset, SeekOrigin origin) {
88 long result = _stream.Seek( _sink, offset * sizeof( char ), origin );
89 _sink.ProcessMessagesAndThrow();
90 return result;
93 public override void SetLength(long value) {
94 if ( value < 0 ) {
95 throw ADP.ArgumentOutOfRange("value");
97 _stream.SetLength( _sink, value * sizeof( char ) );
98 _sink.ProcessMessagesAndThrow();
101 public override int Read(char[] buffer, int offset, int count) {
102 int bytesRead = _stream.Read( _sink, buffer, offset * sizeof( char ), count );
103 _sink.ProcessMessagesAndThrow();
104 return bytesRead;
107 public override void Write(char[] buffer, int offset, int count) {
108 _stream.Write( _sink, buffer, offset, count );
109 _sink.ProcessMessagesAndThrow();
112 // Convenience methods to allow simple pulling/pushing of raw bytes
113 internal int Read(byte[] buffer, int offset, int count) {
114 int bytesRead = _stream.Read( _sink, buffer, offset, count );
115 _sink.ProcessMessagesAndThrow();
116 return bytesRead;
119 internal void Write(byte[] buffer, int offset, int count) {
120 _stream.Write( _sink, buffer, offset, count );
121 _sink.ProcessMessagesAndThrow();