1 //------------------------------------------------------------------------------
2 // <copyright file="SqlClientWrapperSmiStream.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
9 namespace Microsoft
.SqlServer
.Server
{
11 using System
.Data
.Common
;
12 using System
.Data
.SqlClient
;
13 using System
.Data
.SqlTypes
;
14 using System
.Diagnostics
;
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
);
31 public override bool IsNull
{
33 return null == _stream
;
37 public override bool CanRead
{
39 return _stream
.CanRead
;
43 // If CanSeek is false, Position, Seek, Length, and SetLength should throw.
44 public override bool CanSeek
{
46 return _stream
.CanSeek
;
50 public override bool CanWrite
{
52 return _stream
.CanWrite
;
56 public override long Length
{
58 long length
= _stream
.GetLength( _sink
);
59 _sink
.ProcessMessagesAndThrow();
61 return length
/ sizeof( char );
67 public override long Position
{
69 long position
= _stream
.GetPosition( _sink
) / sizeof( char );
70 _sink
.ProcessMessagesAndThrow();
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();
93 public override void SetLength(long value) {
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();
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();
119 internal void Write(byte[] buffer
, int offset
, int count
) {
120 _stream
.Write( _sink
, buffer
, offset
, count
);
121 _sink
.ProcessMessagesAndThrow();