Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Shared / MS / Internal / IO / SynchronizingStream.cs / 1 / SynchronizingStream.cs
//------------------------------------------------------------------------------
// Microsoft Avalon
// Copyright (c) Microsoft Corporation, 2001
//
// File: SynchronizingStream.cs
//
// Description: Stream that locks on given syncRoot before entering any public API's.
//
// History: 01/20/06 - brucemac - created
//-----------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
namespace MS.Internal.IO.Packaging
{
///
/// Wrap returned stream to protect non-thread-safe API's from race conditions
///
internal class SynchronizingStream : Stream
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
///
/// Serializes access by locking on the given object
///
/// stream to read from (baseStream)
/// object to lock on
internal SynchronizingStream(Stream stream, Object syncRoot)
{
if (stream == null)
throw new ArgumentNullException("stream");
if (syncRoot == null)
throw new ArgumentNullException("syncRoot");
_baseStream = stream;
_syncRoot = syncRoot;
}
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
///
/// Return the bytes requested
///
/// destination buffer
/// offset to write into that buffer
/// how many bytes requested
/// how many bytes were written into buffer
public override int Read(byte[] buffer, int offset, int count)
{
lock (_syncRoot)
{
CheckDisposed();
return (_baseStream.Read(buffer, offset, count));
}
}
///
/// Read a single byte
///
/// The unsigned byte cast to an Int32, or -1 if at the end of the stream.
public override int ReadByte()
{
lock (_syncRoot)
{
CheckDisposed();
return (_baseStream.ReadByte());
}
}
///
/// Write a single byte
///
/// byte to write
public override void WriteByte(byte b)
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.WriteByte(b);
}
}
///
/// Seek
///
/// only zero is supported
/// only SeekOrigin.Begin is supported
/// zero
public override long Seek(long offset, SeekOrigin origin)
{
lock (_syncRoot)
{
CheckDisposed();
return _baseStream.Seek(offset, origin);
}
}
///
/// SetLength
///
/// not supported
public override void SetLength(long newLength)
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.SetLength(newLength);
}
}
///
/// Write
///
/// not supported
public override void Write(byte[] buf, int offset, int count)
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.Write(buf, offset, count);
}
}
///
/// Flush
///
/// not supported
public override void Flush()
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.Flush();
}
}
//------------------------------------------------------
//
// Public Properties
//
//------------------------------------------------------
///
/// Is stream readable?
///
public override bool CanRead
{
get
{
lock (_syncRoot)
{
return ((_baseStream != null) && _baseStream.CanRead);
}
}
}
///
/// Is stream seekable?
///
/// We MUST support seek as this is used to implement ILockBytes.ReadAt()
public override bool CanSeek
{
get
{
lock (_syncRoot)
{
return ((_baseStream != null) && _baseStream.CanSeek);
}
}
}
///
/// Is stream writeable?
///
public override bool CanWrite
{
get
{
lock (_syncRoot)
{
return ((_baseStream != null) && _baseStream.CanWrite);
}
}
}
///
/// Logical byte position in this stream
///
public override long Position
{
get
{
lock (_syncRoot)
{
CheckDisposed();
return _baseStream.Position;
}
}
set
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.Position = value;
}
}
}
///
/// Length
///
public override long Length
{
get
{
lock (_syncRoot)
{
CheckDisposed();
return _baseStream.Length;
}
}
}
//-----------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
protected override void Dispose(bool disposing)
{
lock (_syncRoot)
{
try
{
if (disposing && (_baseStream != null))
{
// close the underlying Stream
_baseStream.Close();
// NOTE: We cannot set _syncRoot to null because it is used
// on entry to every public method and property.
}
}
finally
{
base.Dispose(disposing);
_baseStream = null;
}
}
}
//-----------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
///
/// CheckDisposed
///
/// Pre-condition that lock has been acquired.
private void CheckDisposed()
{
if (_baseStream == null)
throw new ObjectDisposedException("Stream");
}
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
private Stream _baseStream; // stream we are wrapping
private Object _syncRoot; // object to lock on
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
// Microsoft Avalon
// Copyright (c) Microsoft Corporation, 2001
//
// File: SynchronizingStream.cs
//
// Description: Stream that locks on given syncRoot before entering any public API's.
//
// History: 01/20/06 - brucemac - created
//-----------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
namespace MS.Internal.IO.Packaging
{
///
/// Wrap returned stream to protect non-thread-safe API's from race conditions
///
internal class SynchronizingStream : Stream
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
///
/// Serializes access by locking on the given object
///
/// stream to read from (baseStream)
/// object to lock on
internal SynchronizingStream(Stream stream, Object syncRoot)
{
if (stream == null)
throw new ArgumentNullException("stream");
if (syncRoot == null)
throw new ArgumentNullException("syncRoot");
_baseStream = stream;
_syncRoot = syncRoot;
}
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
///
/// Return the bytes requested
///
/// destination buffer
/// offset to write into that buffer
/// how many bytes requested
/// how many bytes were written into buffer
public override int Read(byte[] buffer, int offset, int count)
{
lock (_syncRoot)
{
CheckDisposed();
return (_baseStream.Read(buffer, offset, count));
}
}
///
/// Read a single byte
///
/// The unsigned byte cast to an Int32, or -1 if at the end of the stream.
public override int ReadByte()
{
lock (_syncRoot)
{
CheckDisposed();
return (_baseStream.ReadByte());
}
}
///
/// Write a single byte
///
/// byte to write
public override void WriteByte(byte b)
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.WriteByte(b);
}
}
///
/// Seek
///
/// only zero is supported
/// only SeekOrigin.Begin is supported
/// zero
public override long Seek(long offset, SeekOrigin origin)
{
lock (_syncRoot)
{
CheckDisposed();
return _baseStream.Seek(offset, origin);
}
}
///
/// SetLength
///
/// not supported
public override void SetLength(long newLength)
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.SetLength(newLength);
}
}
///
/// Write
///
/// not supported
public override void Write(byte[] buf, int offset, int count)
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.Write(buf, offset, count);
}
}
///
/// Flush
///
/// not supported
public override void Flush()
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.Flush();
}
}
//------------------------------------------------------
//
// Public Properties
//
//------------------------------------------------------
///
/// Is stream readable?
///
public override bool CanRead
{
get
{
lock (_syncRoot)
{
return ((_baseStream != null) && _baseStream.CanRead);
}
}
}
///
/// Is stream seekable?
///
/// We MUST support seek as this is used to implement ILockBytes.ReadAt()
public override bool CanSeek
{
get
{
lock (_syncRoot)
{
return ((_baseStream != null) && _baseStream.CanSeek);
}
}
}
///
/// Is stream writeable?
///
public override bool CanWrite
{
get
{
lock (_syncRoot)
{
return ((_baseStream != null) && _baseStream.CanWrite);
}
}
}
///
/// Logical byte position in this stream
///
public override long Position
{
get
{
lock (_syncRoot)
{
CheckDisposed();
return _baseStream.Position;
}
}
set
{
lock (_syncRoot)
{
CheckDisposed();
_baseStream.Position = value;
}
}
}
///
/// Length
///
public override long Length
{
get
{
lock (_syncRoot)
{
CheckDisposed();
return _baseStream.Length;
}
}
}
//-----------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
protected override void Dispose(bool disposing)
{
lock (_syncRoot)
{
try
{
if (disposing && (_baseStream != null))
{
// close the underlying Stream
_baseStream.Close();
// NOTE: We cannot set _syncRoot to null because it is used
// on entry to every public method and property.
}
}
finally
{
base.Dispose(disposing);
_baseStream = null;
}
}
}
//-----------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
///
/// CheckDisposed
///
/// Pre-condition that lock has been acquired.
private void CheckDisposed()
{
if (_baseStream == null)
throw new ObjectDisposedException("Stream");
}
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
private Stream _baseStream; // stream we are wrapping
private Object _syncRoot; // object to lock on
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MonthChangedEventArgs.cs
- DiagnosticsConfiguration.cs
- ProxyWebPartManager.cs
- CollectionBuilder.cs
- RuleAttributes.cs
- EndPoint.cs
- FontStretchConverter.cs
- TimeManager.cs
- XPathPatternBuilder.cs
- HttpListener.cs
- AssociativeAggregationOperator.cs
- SmiConnection.cs
- SpotLight.cs
- TextElementAutomationPeer.cs
- BuildProvider.cs
- CompiledXpathExpr.cs
- SHA1Managed.cs
- AutomationPatternInfo.cs
- ListViewGroupConverter.cs
- ListViewDataItem.cs
- cryptoapiTransform.cs
- SqlExpander.cs
- IgnoreDataMemberAttribute.cs
- SQLResource.cs
- Selection.cs
- HttpStreamMessage.cs
- GridViewCancelEditEventArgs.cs
- OpenTypeCommon.cs
- TemplateInstanceAttribute.cs
- State.cs
- ProviderManager.cs
- Label.cs
- DeclarativeCatalogPart.cs
- ProfileManager.cs
- ProfileGroupSettingsCollection.cs
- PolyLineSegmentFigureLogic.cs
- WebPartConnectionsEventArgs.cs
- TemplateBuilder.cs
- SqlVersion.cs
- TemplateNameScope.cs
- DbInsertCommandTree.cs
- SettingsPropertyValue.cs
- ColorContext.cs
- ConfigViewGenerator.cs
- AnchoredBlock.cs
- IFormattable.cs
- TransformGroup.cs
- LinkedList.cs
- LogExtent.cs
- XPathArrayIterator.cs
- LinkConverter.cs
- GPStream.cs
- ProfileInfo.cs
- HijriCalendar.cs
- SqlDataSourceSelectingEventArgs.cs
- DocumentPaginator.cs
- PermissionAttributes.cs
- DataProviderNameConverter.cs
- TriggerAction.cs
- DesignerHelpers.cs
- RowBinding.cs
- SqlSupersetValidator.cs
- TimeoutException.cs
- ComplexTypeEmitter.cs
- NominalTypeEliminator.cs
- DescriptionAttribute.cs
- NavigatorInvalidBodyAccessException.cs
- WSDualHttpSecurity.cs
- NotImplementedException.cs
- StatusInfoItem.cs
- InheritanceContextHelper.cs
- ListenDesigner.cs
- UrlPath.cs
- DispatcherOperation.cs
- PartitionerStatic.cs
- DbDataReader.cs
- EngineSiteSapi.cs
- QilGenerator.cs
- ScrollItemProviderWrapper.cs
- COM2FontConverter.cs
- WebPartConnectionsCancelVerb.cs
- DataTableMappingCollection.cs
- ListMarkerSourceInfo.cs
- ToolStripLabel.cs
- OdbcEnvironment.cs
- FormViewModeEventArgs.cs
- SystemEvents.cs
- Util.cs
- ManagementDateTime.cs
- FrameSecurityDescriptor.cs
- ConnectionPoolManager.cs
- EndOfStreamException.cs
- Sql8ExpressionRewriter.cs
- InternalTypeHelper.cs
- MailWriter.cs
- ExpressionPrinter.cs
- baseaxisquery.cs
- ModifierKeysConverter.cs
- x509utils.cs
- WebMethodAttribute.cs