Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Media / Imaging / LateBoundBitmapDecoder.cs / 1305600 / LateBoundBitmapDecoder.cs
//------------------------------------------------------------------------------ // Microsoft Avalon // Copyright (c) Microsoft Corporation, 2003 // // File: LateBoundBitmapDecoder.cs // //----------------------------------------------------------------------------- #pragma warning disable 1634, 1691 // Allow suppression of certain presharp messages using System; using System.IO; using System.IO.Packaging; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Collections.ObjectModel; using System.Reflection; using System.Security; using System.Security.Permissions; using MS.Internal; using MS.Win32.PresentationCore; using System.Diagnostics; using System.Windows.Media; using System.Globalization; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Threading; using System.Windows.Media.Imaging; using MS.Internal.PresentationCore; // SecurityHelper using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; using System.Net; using System.Net.Cache; namespace System.Windows.Media.Imaging { #region LateBoundBitmapDecoder ////// LateBoundBitmapDecoder is a container for bitmap frames. Each bitmap frame is an BitmapFrame. /// Any BitmapFrame it returns are frozen /// be immutable. /// public sealed class LateBoundBitmapDecoder : BitmapDecoder { #region Constructors ////// Constructor /// ////// Critical: This code calls into BitmapDownload.BeginDownload which is critical /// [SecurityCritical] internal LateBoundBitmapDecoder( Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy requestCachePolicy ) : base(true) { _baseUri = baseUri; _uri = uri; _stream = stream; _createOptions = createOptions; _cacheOption = cacheOption; _requestCachePolicy = requestCachePolicy; // Check to see if we need to download content off thread Uri uriToDecode = (_baseUri != null) ? new Uri(_baseUri, _uri) : _uri; if (uriToDecode != null) { if (uriToDecode.Scheme == Uri.UriSchemeHttp || uriToDecode.Scheme == Uri.UriSchemeHttps) { // Begin the download BitmapDownload.BeginDownload(this, uriToDecode, _requestCachePolicy, _stream); _isDownloading = true; } } if (_stream != null && !_stream.CanSeek) { // Begin the download BitmapDownload.BeginDownload(this, uriToDecode, _requestCachePolicy, _stream); _isDownloading = true; } } #endregion #region Properties ////// If there is an palette, return it. /// Otherwise, return null. /// If the LateBoundDecoder is still downloading, the returned Palette is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting palette data is OK /// public override BitmapPalette Palette { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.Palette; } } ////// If there is an embedded color profile, return it. /// Otherwise, return null. /// If the LateBoundDecoder is still downloading, the returned ColorContext is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting colorcontext data is OK /// public override ReadOnlyCollectionColorContexts { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.ColorContexts; } } /// /// If there is a global thumbnail, return it. /// Otherwise, return null. The returned source is frozen. /// If the LateBoundDecoder is still downloading, the returned Thumbnail is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting thumbnail data is OK /// public override BitmapSource Thumbnail { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.Thumbnail; } } ////// The info that identifies this codec. /// If the LateBoundDecoder is still downloading, the returned CodecInfo is null. /// ////// The getter demands RegistryPermission(PermissionState.Unrestricted) /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Demands RegistryPermission(PermissionState.Unrestricted) /// public override BitmapCodecInfo CodecInfo { [SecurityCritical] get { VerifyAccess(); SecurityHelper.DemandRegistryPermission(); if (_isDownloading) { return null; } return Decoder.CodecInfo; } } ////// Access to the individual frames. /// Since a LateBoundBitmapDecoder is downloaded asynchronously, /// its possible the underlying frame collection may change once /// content has been downloaded and decoded. When content is initially /// downloading, the collection will always return at least one item /// in the collection. When the download/decode is complete, the BitmapFrame /// will automatically change its underlying content. i.e. Only the collection /// object may change. The actual frame object will remain the same. /// public override ReadOnlyCollectionFrames { get { VerifyAccess(); // If the content is still being downloaded, create a collection // with 1 item that will point to an empty bitmap if (_isDownloading) { if (_readOnlyFrames == null) { _frames = new List ((int)1); _frames.Add( new BitmapFrameDecode( 0, _createOptions, _cacheOption, this ) ); _readOnlyFrames = new ReadOnlyCollection (_frames); } return _readOnlyFrames; } else { return Decoder.Frames; } } } /// /// If there is a global preview image, return it. /// Otherwise, return null. The returned source is frozen. /// If the LateBoundDecoder is still downloading, the returned Preview is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting preview data is OK /// public override BitmapSource Preview { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.Preview; } } ////// Returns the underlying decoder associated with this late bound decoder. /// If the LateBoundDecoder is still downloading, the underlying decoder is null, /// otherwise the underlying decoder is created on first access. /// public BitmapDecoder Decoder { get { VerifyAccess(); if (_isDownloading || _failed) { return null; } EnsureDecoder(); return _realDecoder; } } ////// Returns if the decoder is downloading content /// public override bool IsDownloading { get { VerifyAccess(); return _isDownloading; } } #endregion #region Methods /// /// Ensure that the underlying decoder is created /// private void EnsureDecoder() { if (_realDecoder == null) { _realDecoder = BitmapDecoder.CreateFromUriOrStream( _baseUri, _uri, _stream, _createOptions & ~BitmapCreateOptions.DelayCreation, _cacheOption, _requestCachePolicy, true ); // Check to see if someone already got the frames // If so, we need to ensure that the real decoder // references the same frame as the one we already created // Creating a new object would be bad. if (_readOnlyFrames != null) { _realDecoder.SetupFrames(null, _readOnlyFrames); // // The frames have been transfered to the real decoder, so we no // longer need them. // _readOnlyFrames = null; _frames = null; } } } /// /// Called when download is complete /// internal object DownloadCallback(object arg) { Stream newStream = (Stream)arg; // Assert that we are able to seek the new stream Debug.Assert(newStream.CanSeek == true); _stream = newStream; // If we are not supposed to delay create, then ensure the decoder // otherwise it will be done on first access if ((_createOptions & BitmapCreateOptions.DelayCreation) == 0) { try { EnsureDecoder(); } catch(Exception e) { #pragma warning disable 6500 return ExceptionCallback(e); #pragma warning restore 6500 } } _isDownloading = false; _downloadEvent.InvokeEvents(this, null); return null; } /// /// Called when download progresses /// internal object ProgressCallback(object arg) { int percentComplete = (int)arg; _progressEvent.InvokeEvents(this, new DownloadProgressEventArgs(percentComplete)); return null; } /// /// Called when an exception occurs /// internal object ExceptionCallback(object arg) { _isDownloading = false; _failed = true; _failedEvent.InvokeEvents(this, new ExceptionEventArgs((Exception)arg)); return null; } #endregion #region Internal Abstract /// Need to implement this to derive from the "sealed" object internal override void SealObject() { throw new NotImplementedException(); } #endregion #region Data Members /// Is downloading data private bool _isDownloading; /// Is downloading data private bool _failed; /// Real decoder private BitmapDecoder _realDecoder; ////// the cache policy to use for web requests. /// private RequestCachePolicy _requestCachePolicy; #endregion } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ // Microsoft Avalon // Copyright (c) Microsoft Corporation, 2003 // // File: LateBoundBitmapDecoder.cs // //----------------------------------------------------------------------------- #pragma warning disable 1634, 1691 // Allow suppression of certain presharp messages using System; using System.IO; using System.IO.Packaging; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Collections.ObjectModel; using System.Reflection; using System.Security; using System.Security.Permissions; using MS.Internal; using MS.Win32.PresentationCore; using System.Diagnostics; using System.Windows.Media; using System.Globalization; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Threading; using System.Windows.Media.Imaging; using MS.Internal.PresentationCore; // SecurityHelper using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; using System.Net; using System.Net.Cache; namespace System.Windows.Media.Imaging { #region LateBoundBitmapDecoder ////// LateBoundBitmapDecoder is a container for bitmap frames. Each bitmap frame is an BitmapFrame. /// Any BitmapFrame it returns are frozen /// be immutable. /// public sealed class LateBoundBitmapDecoder : BitmapDecoder { #region Constructors ////// Constructor /// ////// Critical: This code calls into BitmapDownload.BeginDownload which is critical /// [SecurityCritical] internal LateBoundBitmapDecoder( Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy requestCachePolicy ) : base(true) { _baseUri = baseUri; _uri = uri; _stream = stream; _createOptions = createOptions; _cacheOption = cacheOption; _requestCachePolicy = requestCachePolicy; // Check to see if we need to download content off thread Uri uriToDecode = (_baseUri != null) ? new Uri(_baseUri, _uri) : _uri; if (uriToDecode != null) { if (uriToDecode.Scheme == Uri.UriSchemeHttp || uriToDecode.Scheme == Uri.UriSchemeHttps) { // Begin the download BitmapDownload.BeginDownload(this, uriToDecode, _requestCachePolicy, _stream); _isDownloading = true; } } if (_stream != null && !_stream.CanSeek) { // Begin the download BitmapDownload.BeginDownload(this, uriToDecode, _requestCachePolicy, _stream); _isDownloading = true; } } #endregion #region Properties ////// If there is an palette, return it. /// Otherwise, return null. /// If the LateBoundDecoder is still downloading, the returned Palette is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting palette data is OK /// public override BitmapPalette Palette { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.Palette; } } ////// If there is an embedded color profile, return it. /// Otherwise, return null. /// If the LateBoundDecoder is still downloading, the returned ColorContext is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting colorcontext data is OK /// public override ReadOnlyCollectionColorContexts { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.ColorContexts; } } /// /// If there is a global thumbnail, return it. /// Otherwise, return null. The returned source is frozen. /// If the LateBoundDecoder is still downloading, the returned Thumbnail is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting thumbnail data is OK /// public override BitmapSource Thumbnail { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.Thumbnail; } } ////// The info that identifies this codec. /// If the LateBoundDecoder is still downloading, the returned CodecInfo is null. /// ////// The getter demands RegistryPermission(PermissionState.Unrestricted) /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Demands RegistryPermission(PermissionState.Unrestricted) /// public override BitmapCodecInfo CodecInfo { [SecurityCritical] get { VerifyAccess(); SecurityHelper.DemandRegistryPermission(); if (_isDownloading) { return null; } return Decoder.CodecInfo; } } ////// Access to the individual frames. /// Since a LateBoundBitmapDecoder is downloaded asynchronously, /// its possible the underlying frame collection may change once /// content has been downloaded and decoded. When content is initially /// downloading, the collection will always return at least one item /// in the collection. When the download/decode is complete, the BitmapFrame /// will automatically change its underlying content. i.e. Only the collection /// object may change. The actual frame object will remain the same. /// public override ReadOnlyCollectionFrames { get { VerifyAccess(); // If the content is still being downloaded, create a collection // with 1 item that will point to an empty bitmap if (_isDownloading) { if (_readOnlyFrames == null) { _frames = new List ((int)1); _frames.Add( new BitmapFrameDecode( 0, _createOptions, _cacheOption, this ) ); _readOnlyFrames = new ReadOnlyCollection (_frames); } return _readOnlyFrames; } else { return Decoder.Frames; } } } /// /// If there is a global preview image, return it. /// Otherwise, return null. The returned source is frozen. /// If the LateBoundDecoder is still downloading, the returned Preview is null. /// ////// Critical - Access unmanaged code, codecs /// PublicOK - Getting preview data is OK /// public override BitmapSource Preview { [SecurityCritical] get { VerifyAccess(); if (_isDownloading) { return null; } return Decoder.Preview; } } ////// Returns the underlying decoder associated with this late bound decoder. /// If the LateBoundDecoder is still downloading, the underlying decoder is null, /// otherwise the underlying decoder is created on first access. /// public BitmapDecoder Decoder { get { VerifyAccess(); if (_isDownloading || _failed) { return null; } EnsureDecoder(); return _realDecoder; } } ////// Returns if the decoder is downloading content /// public override bool IsDownloading { get { VerifyAccess(); return _isDownloading; } } #endregion #region Methods /// /// Ensure that the underlying decoder is created /// private void EnsureDecoder() { if (_realDecoder == null) { _realDecoder = BitmapDecoder.CreateFromUriOrStream( _baseUri, _uri, _stream, _createOptions & ~BitmapCreateOptions.DelayCreation, _cacheOption, _requestCachePolicy, true ); // Check to see if someone already got the frames // If so, we need to ensure that the real decoder // references the same frame as the one we already created // Creating a new object would be bad. if (_readOnlyFrames != null) { _realDecoder.SetupFrames(null, _readOnlyFrames); // // The frames have been transfered to the real decoder, so we no // longer need them. // _readOnlyFrames = null; _frames = null; } } } /// /// Called when download is complete /// internal object DownloadCallback(object arg) { Stream newStream = (Stream)arg; // Assert that we are able to seek the new stream Debug.Assert(newStream.CanSeek == true); _stream = newStream; // If we are not supposed to delay create, then ensure the decoder // otherwise it will be done on first access if ((_createOptions & BitmapCreateOptions.DelayCreation) == 0) { try { EnsureDecoder(); } catch(Exception e) { #pragma warning disable 6500 return ExceptionCallback(e); #pragma warning restore 6500 } } _isDownloading = false; _downloadEvent.InvokeEvents(this, null); return null; } /// /// Called when download progresses /// internal object ProgressCallback(object arg) { int percentComplete = (int)arg; _progressEvent.InvokeEvents(this, new DownloadProgressEventArgs(percentComplete)); return null; } /// /// Called when an exception occurs /// internal object ExceptionCallback(object arg) { _isDownloading = false; _failed = true; _failedEvent.InvokeEvents(this, new ExceptionEventArgs((Exception)arg)); return null; } #endregion #region Internal Abstract /// Need to implement this to derive from the "sealed" object internal override void SealObject() { throw new NotImplementedException(); } #endregion #region Data Members /// Is downloading data private bool _isDownloading; /// Is downloading data private bool _failed; /// Real decoder private BitmapDecoder _realDecoder; ////// the cache policy to use for web requests. /// private RequestCachePolicy _requestCachePolicy; #endregion } #endregion } // 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
- TreeIterator.cs
- Utility.cs
- ValidatedMobileControlConverter.cs
- C14NUtil.cs
- InstanceDataCollectionCollection.cs
- ping.cs
- DataRowView.cs
- FileDialogCustomPlace.cs
- Enlistment.cs
- XsltInput.cs
- OdbcConnectionOpen.cs
- SmtpReplyReader.cs
- HtmlTable.cs
- DrawingAttributes.cs
- OdbcConnection.cs
- TextBox.cs
- ApplicationSecurityInfo.cs
- MenuItemCollection.cs
- QueryStringParameter.cs
- IgnorePropertiesAttribute.cs
- SerializationStore.cs
- ArrayElementGridEntry.cs
- SQLDecimal.cs
- TransformValueSerializer.cs
- MimeReflector.cs
- ApplicationCommands.cs
- DelayedRegex.cs
- SettingsPropertyCollection.cs
- IHttpResponseInternal.cs
- ColumnReorderedEventArgs.cs
- LogicalCallContext.cs
- WindowsSolidBrush.cs
- ToolStripItemClickedEventArgs.cs
- DragDrop.cs
- DataServiceResponse.cs
- ControlBuilderAttribute.cs
- PersistChildrenAttribute.cs
- PointLightBase.cs
- ImageMetadata.cs
- LinkArea.cs
- SharedStatics.cs
- SqlConnection.cs
- StylusButtonCollection.cs
- ITreeGenerator.cs
- TextBoxBase.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- LinkClickEvent.cs
- UnsafeNativeMethods.cs
- XmlTypeMapping.cs
- Random.cs
- ImageList.cs
- MembershipSection.cs
- DbDataRecord.cs
- Opcode.cs
- GatewayDefinition.cs
- PriorityBinding.cs
- util.cs
- ObjectTokenCategory.cs
- RectangleHotSpot.cs
- XmlWellformedWriterHelpers.cs
- MergeFilterQuery.cs
- AsnEncodedData.cs
- TileBrush.cs
- XmlSchemaAny.cs
- ViewGenerator.cs
- DrawListViewColumnHeaderEventArgs.cs
- VisualTarget.cs
- AsmxEndpointPickerExtension.cs
- EntityDataSourceReferenceGroup.cs
- MasterPage.cs
- ApplicationServiceHelper.cs
- MetadataUtil.cs
- Matrix3DStack.cs
- FileDialog_Vista_Interop.cs
- AsymmetricKeyExchangeFormatter.cs
- IChannel.cs
- BigInt.cs
- TextDecoration.cs
- RegistryExceptionHelper.cs
- TabletDevice.cs
- CachedTypeface.cs
- ItemsChangedEventArgs.cs
- BrowserCapabilitiesFactoryBase.cs
- XmlUtilWriter.cs
- ConnectionInterfaceCollection.cs
- ExecutedRoutedEventArgs.cs
- XamlTreeBuilderBamlRecordWriter.cs
- ErrorWrapper.cs
- ScrollEventArgs.cs
- ping.cs
- AppDomainProtocolHandler.cs
- ObjectStateFormatter.cs
- PropertyDescriptorGridEntry.cs
- ModifierKeysConverter.cs
- ProcessModuleCollection.cs
- EDesignUtil.cs
- LayoutSettings.cs
- RoutedEvent.cs
- TextServicesHost.cs
- ReadOnlyHierarchicalDataSource.cs