Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / XmlDownloadManager.cs / 1305376 / XmlDownloadManager.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml { using System; using System.IO; using System.Security; using System.Collections; using System.Net; using System.Net.Cache; using System.Runtime.Versioning; // // XmlDownloadManager // internal class XmlDownloadManager { Hashtable connections; [ResourceConsumption(ResourceScope.Machine)] [ResourceExposure(ResourceScope.Machine)] internal Stream GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy) { if ( uri.Scheme == "file" ) { return new FileStream( uri.LocalPath, FileMode.Open, FileAccess.Read, FileShare.Read, 1 ); } else { return GetNonFileStream( uri, credentials, proxy, cachePolicy ); } } private Stream GetNonFileStream( Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy ) { WebRequest req = WebRequest.Create( uri ); if ( credentials != null ) { req.Credentials = credentials; } if ( proxy != null ) { req.Proxy = proxy; } if ( cachePolicy != null ) { req.CachePolicy = cachePolicy; } WebResponse resp = req.GetResponse(); HttpWebRequest webReq = req as HttpWebRequest; if ( webReq != null ) { lock ( this ) { if ( connections == null ) { connections = new Hashtable(); } OpenedHost openedHost = (OpenedHost)connections[webReq.Address.Host]; if ( openedHost == null ) { openedHost = new OpenedHost(); } if ( openedHost.nonCachedConnectionsCount < webReq.ServicePoint.ConnectionLimit - 1 ) { // we are not close to connection limit -> don't cache the stream if ( openedHost.nonCachedConnectionsCount == 0 ) { connections.Add( webReq.Address.Host, openedHost ); } openedHost.nonCachedConnectionsCount++; return new XmlRegisteredNonCachedStream( resp.GetResponseStream(), this, webReq.Address.Host ); } else { // cache the stream and save the connection for the next request return new XmlCachedStream( resp.ResponseUri, resp.GetResponseStream() ); } } } else { return resp.GetResponseStream(); } } internal void Remove( string host ) { lock ( this ) { OpenedHost openedHost = (OpenedHost)connections[host]; if ( openedHost != null ) { if ( --openedHost.nonCachedConnectionsCount == 0 ) { connections.Remove( host ); } } } } } // // OpenedHost // internal class OpenedHost { internal int nonCachedConnectionsCount; } // // XmlRegisteredNonCachedStream // internal class XmlRegisteredNonCachedStream : Stream { protected Stream stream; XmlDownloadManager downloadManager; string host; internal XmlRegisteredNonCachedStream( Stream stream, XmlDownloadManager downloadManager, string host ) { this.stream = stream; this.downloadManager = downloadManager; this.host = host; } ~XmlRegisteredNonCachedStream() { if ( downloadManager != null ) { downloadManager.Remove( host ); } stream = null; // The base class, Stream, provides its own finalizer } protected override void Dispose( bool disposing ) { try { if ( disposing && stream != null ) { if ( downloadManager != null ) { downloadManager.Remove( host ); } stream.Close(); } stream = null; GC.SuppressFinalize( this ); // do not call finalizer } finally { base.Dispose( disposing ); } } // // Stream // public override IAsyncResult BeginRead( byte[] buffer, int offset, int count, AsyncCallback callback, object state ) { return stream.BeginRead( buffer, offset, count, callback, state ); } public override IAsyncResult BeginWrite( byte[] buffer, int offset, int count, AsyncCallback callback, object state ) { return BeginWrite( buffer, offset, count, callback, state ); } public override int EndRead( IAsyncResult asyncResult ) { return stream.EndRead( asyncResult ); } public override void EndWrite( IAsyncResult asyncResult ) { stream.EndWrite( asyncResult ); } public override void Flush() { stream.Flush(); } public override int Read( byte[] buffer, int offset, int count ) { return stream.Read( buffer, offset, count ); } public override int ReadByte() { return stream.ReadByte(); } public override long Seek( long offset, SeekOrigin origin ) { return stream.Seek( offset, origin ); } public override void SetLength( long value ) { stream.SetLength( value ); } public override void Write( byte[] buffer, int offset, int count ) { stream.Write( buffer, offset, count ); } public override void WriteByte( byte value ) { stream.WriteByte( value ); } public override Boolean CanRead { get { return stream.CanRead; } } public override Boolean CanSeek { get { return stream.CanSeek; } } public override Boolean CanWrite { get { return stream.CanWrite; } } public override long Length { get { return stream.Length; } } public override long Position { get { return stream.Position; } set { stream.Position = value; } } } // // XmlCachedStream // internal class XmlCachedStream : MemoryStream { private const int MoveBufferSize = 4096; private Uri uri; internal XmlCachedStream( Uri uri, Stream stream ) : base() { this.uri = uri; try { byte[] bytes = new byte[MoveBufferSize]; int read = 0; while ( ( read = stream.Read( bytes, 0, MoveBufferSize ) ) > 0 ) { this.Write( bytes, 0, read ); } base.Position = 0; } finally { stream.Close(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml { using System; using System.IO; using System.Security; using System.Collections; using System.Net; using System.Net.Cache; using System.Runtime.Versioning; // // XmlDownloadManager // internal class XmlDownloadManager { Hashtable connections; [ResourceConsumption(ResourceScope.Machine)] [ResourceExposure(ResourceScope.Machine)] internal Stream GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy) { if ( uri.Scheme == "file" ) { return new FileStream( uri.LocalPath, FileMode.Open, FileAccess.Read, FileShare.Read, 1 ); } else { return GetNonFileStream( uri, credentials, proxy, cachePolicy ); } } private Stream GetNonFileStream( Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy ) { WebRequest req = WebRequest.Create( uri ); if ( credentials != null ) { req.Credentials = credentials; } if ( proxy != null ) { req.Proxy = proxy; } if ( cachePolicy != null ) { req.CachePolicy = cachePolicy; } WebResponse resp = req.GetResponse(); HttpWebRequest webReq = req as HttpWebRequest; if ( webReq != null ) { lock ( this ) { if ( connections == null ) { connections = new Hashtable(); } OpenedHost openedHost = (OpenedHost)connections[webReq.Address.Host]; if ( openedHost == null ) { openedHost = new OpenedHost(); } if ( openedHost.nonCachedConnectionsCount < webReq.ServicePoint.ConnectionLimit - 1 ) { // we are not close to connection limit -> don't cache the stream if ( openedHost.nonCachedConnectionsCount == 0 ) { connections.Add( webReq.Address.Host, openedHost ); } openedHost.nonCachedConnectionsCount++; return new XmlRegisteredNonCachedStream( resp.GetResponseStream(), this, webReq.Address.Host ); } else { // cache the stream and save the connection for the next request return new XmlCachedStream( resp.ResponseUri, resp.GetResponseStream() ); } } } else { return resp.GetResponseStream(); } } internal void Remove( string host ) { lock ( this ) { OpenedHost openedHost = (OpenedHost)connections[host]; if ( openedHost != null ) { if ( --openedHost.nonCachedConnectionsCount == 0 ) { connections.Remove( host ); } } } } } // // OpenedHost // internal class OpenedHost { internal int nonCachedConnectionsCount; } // // XmlRegisteredNonCachedStream // internal class XmlRegisteredNonCachedStream : Stream { protected Stream stream; XmlDownloadManager downloadManager; string host; internal XmlRegisteredNonCachedStream( Stream stream, XmlDownloadManager downloadManager, string host ) { this.stream = stream; this.downloadManager = downloadManager; this.host = host; } ~XmlRegisteredNonCachedStream() { if ( downloadManager != null ) { downloadManager.Remove( host ); } stream = null; // The base class, Stream, provides its own finalizer } protected override void Dispose( bool disposing ) { try { if ( disposing && stream != null ) { if ( downloadManager != null ) { downloadManager.Remove( host ); } stream.Close(); } stream = null; GC.SuppressFinalize( this ); // do not call finalizer } finally { base.Dispose( disposing ); } } // // Stream // public override IAsyncResult BeginRead( byte[] buffer, int offset, int count, AsyncCallback callback, object state ) { return stream.BeginRead( buffer, offset, count, callback, state ); } public override IAsyncResult BeginWrite( byte[] buffer, int offset, int count, AsyncCallback callback, object state ) { return BeginWrite( buffer, offset, count, callback, state ); } public override int EndRead( IAsyncResult asyncResult ) { return stream.EndRead( asyncResult ); } public override void EndWrite( IAsyncResult asyncResult ) { stream.EndWrite( asyncResult ); } public override void Flush() { stream.Flush(); } public override int Read( byte[] buffer, int offset, int count ) { return stream.Read( buffer, offset, count ); } public override int ReadByte() { return stream.ReadByte(); } public override long Seek( long offset, SeekOrigin origin ) { return stream.Seek( offset, origin ); } public override void SetLength( long value ) { stream.SetLength( value ); } public override void Write( byte[] buffer, int offset, int count ) { stream.Write( buffer, offset, count ); } public override void WriteByte( byte value ) { stream.WriteByte( value ); } public override Boolean CanRead { get { return stream.CanRead; } } public override Boolean CanSeek { get { return stream.CanSeek; } } public override Boolean CanWrite { get { return stream.CanWrite; } } public override long Length { get { return stream.Length; } } public override long Position { get { return stream.Position; } set { stream.Position = value; } } } // // XmlCachedStream // internal class XmlCachedStream : MemoryStream { private const int MoveBufferSize = 4096; private Uri uri; internal XmlCachedStream( Uri uri, Stream stream ) : base() { this.uri = uri; try { byte[] bytes = new byte[MoveBufferSize]; int read = 0; while ( ( read = stream.Read( bytes, 0, MoveBufferSize ) ) > 0 ) { this.Write( bytes, 0, read ); } base.Position = 0; } finally { stream.Close(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RadioButtonFlatAdapter.cs
- DataGridRowClipboardEventArgs.cs
- SettingsPropertyNotFoundException.cs
- IndexOutOfRangeException.cs
- CodeLinePragma.cs
- ContextDataSource.cs
- MemberAssignment.cs
- AddInDeploymentState.cs
- TypeGeneratedEventArgs.cs
- PreProcessor.cs
- WebScriptClientGenerator.cs
- ConfigXmlDocument.cs
- BaseCollection.cs
- SizeAnimationClockResource.cs
- StickyNoteAnnotations.cs
- DynamicDataRoute.cs
- XmlNodeChangedEventArgs.cs
- StrongNameIdentityPermission.cs
- TextModifier.cs
- RouteUrlExpressionBuilder.cs
- FilteredSchemaElementLookUpTable.cs
- Odbc32.cs
- _NegoStream.cs
- WeakReferenceKey.cs
- serverconfig.cs
- WebPartDisplayModeCancelEventArgs.cs
- CategoriesDocumentFormatter.cs
- DataGridViewBindingCompleteEventArgs.cs
- ThousandthOfEmRealDoubles.cs
- ChooseAction.cs
- UnitySerializationHolder.cs
- latinshape.cs
- Imaging.cs
- XsdValidatingReader.cs
- CoTaskMemHandle.cs
- CodeDOMProvider.cs
- SQLDecimalStorage.cs
- CopyOfAction.cs
- LayoutEvent.cs
- ByteArrayHelperWithString.cs
- WindowsIdentity.cs
- InternalPermissions.cs
- SerializerWriterEventHandlers.cs
- CompensationParticipant.cs
- LineServicesRun.cs
- PropertyTabChangedEvent.cs
- ListParagraph.cs
- EmptyEnumerator.cs
- LocalizableAttribute.cs
- ToolStripItemImageRenderEventArgs.cs
- HiddenFieldDesigner.cs
- ProxyWebPartManager.cs
- Bits.cs
- StyleCollectionEditor.cs
- WasNotInstalledException.cs
- XmlCompatibilityReader.cs
- DesignerActionListCollection.cs
- DesignerDataTableBase.cs
- BitVector32.cs
- EncryptedKey.cs
- JavaScriptSerializer.cs
- RuntimeConfigLKG.cs
- EventLogPermission.cs
- TextServicesCompartmentEventSink.cs
- ResolveCriteria.cs
- CallTemplateAction.cs
- MarshalByValueComponent.cs
- SessionEndingEventArgs.cs
- PathStreamGeometryContext.cs
- SQLGuidStorage.cs
- BindingCollection.cs
- FrameAutomationPeer.cs
- PrimitiveType.cs
- XmlSchemaAppInfo.cs
- FontStretchConverter.cs
- _AutoWebProxyScriptWrapper.cs
- FloaterBaseParagraph.cs
- ClientSideProviderDescription.cs
- FormViewInsertEventArgs.cs
- OpenCollectionAsyncResult.cs
- EntityClientCacheKey.cs
- SecurityImpersonationBehavior.cs
- HttpDigestClientCredential.cs
- ExceptionTrace.cs
- RijndaelManaged.cs
- TypeInfo.cs
- FormsAuthenticationCredentials.cs
- PostBackOptions.cs
- TypeInitializationException.cs
- XmlSerializableWriter.cs
- RadioButtonList.cs
- AudioFormatConverter.cs
- PersonalizationProvider.cs
- StickyNote.cs
- StylusPointPropertyInfo.cs
- DataFieldEditor.cs
- GridViewUpdatedEventArgs.cs
- IriParsingElement.cs
- GridViewDeletedEventArgs.cs
- TableParaClient.cs