Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / System / Windows / Media / Imaging / LateBoundBitmapDecoder.cs / 2 / 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); } } } /// /// 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
- DataControlPagerLinkButton.cs
- TaskHelper.cs
- SHA1.cs
- TextFindEngine.cs
- GeneralTransform3D.cs
- DiscoveryClientProtocol.cs
- ErrorWrapper.cs
- SchemaCreator.cs
- EditorAttribute.cs
- ConnectionModeReader.cs
- InfoCardServiceInstallComponent.cs
- SqlInternalConnectionTds.cs
- BasicExpressionVisitor.cs
- ToolStripContentPanelRenderEventArgs.cs
- WebPartZone.cs
- HostedElements.cs
- Catch.cs
- GCHandleCookieTable.cs
- ReadWriteControlDesigner.cs
- GcHandle.cs
- GetWinFXPath.cs
- EntityKeyElement.cs
- InternalConfigRoot.cs
- AsyncMethodInvoker.cs
- Query.cs
- DataObjectEventArgs.cs
- ElementHostAutomationPeer.cs
- SiteMapDataSource.cs
- MutableAssemblyCacheEntry.cs
- AnnotationService.cs
- XPathPatternParser.cs
- ConnectionStringsExpressionEditor.cs
- altserialization.cs
- MediaScriptCommandRoutedEventArgs.cs
- DataViewManagerListItemTypeDescriptor.cs
- ExceptionValidationRule.cs
- FixedTextBuilder.cs
- IpcClientChannel.cs
- WindowsIdentity.cs
- ObjectDataSourceDisposingEventArgs.cs
- CallbackHandler.cs
- XamlDesignerSerializationManager.cs
- DirectoryRootQuery.cs
- ScriptingAuthenticationServiceSection.cs
- QueryInterceptorAttribute.cs
- UnwrappedTypesXmlSerializerManager.cs
- ContextInformation.cs
- IntegerValidatorAttribute.cs
- Error.cs
- BaseServiceProvider.cs
- EdmItemError.cs
- DataErrorValidationRule.cs
- DataGridRow.cs
- Executor.cs
- InfoCard.cs
- IdentityHolder.cs
- DBConcurrencyException.cs
- CustomUserNameSecurityTokenAuthenticator.cs
- Rect3DValueSerializer.cs
- ChainedAsyncResult.cs
- ProvidersHelper.cs
- XmlTextReaderImpl.cs
- XsdDataContractImporter.cs
- ConfigurationLoaderException.cs
- MetadataArtifactLoaderCompositeFile.cs
- ImageAnimator.cs
- DbConnectionPoolGroup.cs
- validationstate.cs
- TagPrefixInfo.cs
- ManifestSignedXml.cs
- MobileUserControl.cs
- ScriptResourceMapping.cs
- DrawingGroupDrawingContext.cs
- ComboBoxDesigner.cs
- LinkLabelLinkClickedEvent.cs
- HttpRuntimeSection.cs
- RelationshipEndMember.cs
- ListViewAutomationPeer.cs
- LayoutInformation.cs
- XmlSchemaProviderAttribute.cs
- ReferenceTypeElement.cs
- PeerNameRegistration.cs
- RegexWorker.cs
- SafeNativeMethods.cs
- HtmlGenericControl.cs
- ProgressBar.cs
- StreamGeometry.cs
- SqlCommandBuilder.cs
- ParagraphResult.cs
- MessageSecurityOverTcp.cs
- RijndaelCryptoServiceProvider.cs
- HtmlElement.cs
- PropertyInformationCollection.cs
- OrCondition.cs
- SwitchElementsCollection.cs
- TextLineResult.cs
- Page.cs
- XamlTemplateSerializer.cs
- ProfileSection.cs
- EncoderFallback.cs