Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / System / Windows / Markup / TreeBuilder.cs / 1 / TreeBuilder.cs
/****************************************************************************\ * * File: TreeBuilder.cs * * Purpose: Class that builds a stream from XAML or BAML and handles * * History: * 6/06/01: rogerg Created * 5/28/03: peterost Ported to wcp * * Copyright (C) 2002 by Microsoft Corporation. All rights reserved. * \***************************************************************************/ using System; using System.Xml; using System.IO; using System.Text; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; using MS.Utility; #if PBTCOMPILER namespace MS.Internal.Markup #else using System.Windows; using System.Windows.Threading; namespace System.Windows.Markup #endif { ////// internal base class that acts as the Traffic cop for reading BAMl and XMAL. /// The XamlTreeBuilder and TreeBuilderBamlTranslator class override this class for each /// of there implementations. /// internal abstract class TreeBuilder { #region Constructors ////// Constructor /// public TreeBuilder() { } #endregion Constructors #region Methods #if !PBTCOMPILER ////// Internal Avalon method. Used to load the file. Does not allow multiple roots. /// ///The root of the loaded file public object Parse () { // if there is a BamlRecordReader setup the inherited Properties Debug.Assert (null != RecordReader, "No BamlRecordReader at Parse() time"); object root = ParseFragment (); // If the root is a DependencyObject, then store the XamlTypeMapper's xmlns hashtable on // it so that it can be used for runtime lookups of xaml namespace prefixes. Make // sure to enter the context associated with the root, since the context may change // for async parse cases if (root is DependencyObject && !RecordReader.IsRootAlreadyLoaded) { ((DependencyObject)root).SetValue(XmlAttributeProperties.XmlNamespaceMapsProperty, RecordReader.XamlTypeMapper.NamespaceMapHashList); } // Or, if the root is a MarupExtension, we need to convert it into it's final value. else if( root is MarkupExtension ) { root = (root as MarkupExtension).ProvideValue(null); } return root; } #endif ////// Internal Avalon method. Used to Load a file. /// ///An array containing the root objects Loaded from the stream stream public virtual object ParseFragment () { Debug.Assert (false, "Parse Fragment was not overidden"); return null; } #if !PBTCOMPILER // No async support for compilation ////// called when in async mode when get a time slice to read and load the Tree /// internal virtual void HandleAsyncQueueItem () { Debug.Assert (false == RecordReader.EndOfDocument); // shouldn't be called after end try { int startTickCount = MS.Win32.SafeNativeMethods.GetTickCount(); bool moreData = true; // It is possible that we have encountered an exception while parsing/loading // the root element which would have happened prior to this. Hence the additional checks. if (!_parseStarted && !RecordReader.EndOfDocument && !ParseError && !ParseCancelled) { if(RecordReader.BytesAvailible < BamlVersionHeader.BinarySerializationSize) { return; } RecordReader.ReadVersionHeader(); _parseStarted = true; } // for debugging, can set the Maximum Async records to // read via markup // x:AsyncRecords="3" would loop three times // Todo: This should either be removed at some point int maxRecords = MaxAsyncRecords; // while there is moreData and not at the end of document. while (moreData && !RecordReader.EndOfDocument && !ParseError && !ParseCancelled) { moreData = RecordReader.Read (true /* single record mode*/); //Debug.Assert (1 >= RootList.Count, "Multiple roots not supported in async mode"); // check the timeout int elapsed = MS.Win32.SafeNativeMethods.GetTickCount() - startTickCount; // check for rollover if (elapsed < 0) { startTickCount = 0; // reset to 0, } else if (elapsed > AsyncLoopTimeout) { break; } // decrement and compare with zero so the unitialized -1 and zero case // doesn't break the loop. if (--maxRecords == 0) { break; } } } catch (XamlParseException e) { ParseException = e; } finally { if (ParseError || ParseCancelled) { Debug.Assert (ParseError == (null != ParseException), "ParseError flag and ParseException must match up"); TreeBuildComplete(); } else { // if not at the EndOfDocument then post another work item if (false == RecordReader.EndOfDocument) { Post (); } else { // Building of the Tree is complete. TreeBuildComplete (); } } } } #endif ////// Called when Tree has been completely built. /// internal virtual void TreeBuildComplete () { } #endregion Methods #region Properties #if !PBTCOMPILER ////// ParserHooks implementation /// internal ParserHooks ParserHooks { get { return _hooks; } set { _hooks = value; } } ////// Root element /// internal object GetRoot() { ArrayList roots = RecordReader.RootList; object root = (null == roots || 0 == roots.Count) ? null : roots[0]; if (root != null && roots.Count > 1) { throw new XamlParseException(SR.Get(SRID.ParserMultiRoot)); } return root; } ////// BamlRecordReader used for Loading the Tree /// internal BamlRecordReader RecordReader { get { return _bamlRecordReader; } set { _bamlRecordReader = value; } } #endif #if !PBTCOMPILER ////// Mode we are loading the file in [....], Async /// internal XamlParseMode XamlParseMode { get { return _xamlParseMode; } set { _xamlParseMode = value; } } ////// Maximum amount of records allowed to read within /// a HandleAsync call /// internal int MaxAsyncRecords { get { return _maxAsyncRecords; } set { _maxAsyncRecords = value; } } ////// flag to indicate a ParseError occured /// internal bool ParseError { get { return _parseException != null; } } ////// Exception that caused the Parse Error /// internal Exception ParseException { get { return _parseException; } set { _parseException = value; } } ////// Flag to indicate that the Parse was Cancelled before the tree was /// completely loaded. /// internal bool ParseCancelled { get { return _parseCancelled; } set { _parseCancelled = value; } } #endif #endregion Properties #region Queuing #if !PBTCOMPILER ////// Post a queue item at default priority /// internal void Post () { Post (DispatcherPriority.Background); } ////// Post a queue item at the specified priority /// internal void Post (DispatcherPriority priority) { DispatcherOperationCallback callback = new DispatcherOperationCallback (Dispatch); Dispatcher.CurrentDispatcher.BeginInvoke(priority, callback, this); } ////// Dispatch delegate /// private object Dispatch (object o) { DispatchParserQueueEvent ((TreeBuilder)o); return null; } private void DispatchParserQueueEvent (TreeBuilder treeBuilder) { treeBuilder.HandleAsyncQueueItem (); } #endif #endregion Queuing #region Data // const int AsyncLoopTimeout = (int)200; #if !PBTCOMPILER BamlRecordReader _bamlRecordReader; XamlParseMode _xamlParseMode; ParserHooks _hooks; bool _parseCancelled; bool _parseStarted; Exception _parseException; int _maxAsyncRecords; #endif #endregion Data } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. /****************************************************************************\ * * File: TreeBuilder.cs * * Purpose: Class that builds a stream from XAML or BAML and handles * * History: * 6/06/01: rogerg Created * 5/28/03: peterost Ported to wcp * * Copyright (C) 2002 by Microsoft Corporation. All rights reserved. * \***************************************************************************/ using System; using System.Xml; using System.IO; using System.Text; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; using MS.Utility; #if PBTCOMPILER namespace MS.Internal.Markup #else using System.Windows; using System.Windows.Threading; namespace System.Windows.Markup #endif { ////// internal base class that acts as the Traffic cop for reading BAMl and XMAL. /// The XamlTreeBuilder and TreeBuilderBamlTranslator class override this class for each /// of there implementations. /// internal abstract class TreeBuilder { #region Constructors ////// Constructor /// public TreeBuilder() { } #endregion Constructors #region Methods #if !PBTCOMPILER ////// Internal Avalon method. Used to load the file. Does not allow multiple roots. /// ///The root of the loaded file public object Parse () { // if there is a BamlRecordReader setup the inherited Properties Debug.Assert (null != RecordReader, "No BamlRecordReader at Parse() time"); object root = ParseFragment (); // If the root is a DependencyObject, then store the XamlTypeMapper's xmlns hashtable on // it so that it can be used for runtime lookups of xaml namespace prefixes. Make // sure to enter the context associated with the root, since the context may change // for async parse cases if (root is DependencyObject && !RecordReader.IsRootAlreadyLoaded) { ((DependencyObject)root).SetValue(XmlAttributeProperties.XmlNamespaceMapsProperty, RecordReader.XamlTypeMapper.NamespaceMapHashList); } // Or, if the root is a MarupExtension, we need to convert it into it's final value. else if( root is MarkupExtension ) { root = (root as MarkupExtension).ProvideValue(null); } return root; } #endif ////// Internal Avalon method. Used to Load a file. /// ///An array containing the root objects Loaded from the stream stream public virtual object ParseFragment () { Debug.Assert (false, "Parse Fragment was not overidden"); return null; } #if !PBTCOMPILER // No async support for compilation ////// called when in async mode when get a time slice to read and load the Tree /// internal virtual void HandleAsyncQueueItem () { Debug.Assert (false == RecordReader.EndOfDocument); // shouldn't be called after end try { int startTickCount = MS.Win32.SafeNativeMethods.GetTickCount(); bool moreData = true; // It is possible that we have encountered an exception while parsing/loading // the root element which would have happened prior to this. Hence the additional checks. if (!_parseStarted && !RecordReader.EndOfDocument && !ParseError && !ParseCancelled) { if(RecordReader.BytesAvailible < BamlVersionHeader.BinarySerializationSize) { return; } RecordReader.ReadVersionHeader(); _parseStarted = true; } // for debugging, can set the Maximum Async records to // read via markup // x:AsyncRecords="3" would loop three times // Todo: This should either be removed at some point int maxRecords = MaxAsyncRecords; // while there is moreData and not at the end of document. while (moreData && !RecordReader.EndOfDocument && !ParseError && !ParseCancelled) { moreData = RecordReader.Read (true /* single record mode*/); //Debug.Assert (1 >= RootList.Count, "Multiple roots not supported in async mode"); // check the timeout int elapsed = MS.Win32.SafeNativeMethods.GetTickCount() - startTickCount; // check for rollover if (elapsed < 0) { startTickCount = 0; // reset to 0, } else if (elapsed > AsyncLoopTimeout) { break; } // decrement and compare with zero so the unitialized -1 and zero case // doesn't break the loop. if (--maxRecords == 0) { break; } } } catch (XamlParseException e) { ParseException = e; } finally { if (ParseError || ParseCancelled) { Debug.Assert (ParseError == (null != ParseException), "ParseError flag and ParseException must match up"); TreeBuildComplete(); } else { // if not at the EndOfDocument then post another work item if (false == RecordReader.EndOfDocument) { Post (); } else { // Building of the Tree is complete. TreeBuildComplete (); } } } } #endif ////// Called when Tree has been completely built. /// internal virtual void TreeBuildComplete () { } #endregion Methods #region Properties #if !PBTCOMPILER ////// ParserHooks implementation /// internal ParserHooks ParserHooks { get { return _hooks; } set { _hooks = value; } } ////// Root element /// internal object GetRoot() { ArrayList roots = RecordReader.RootList; object root = (null == roots || 0 == roots.Count) ? null : roots[0]; if (root != null && roots.Count > 1) { throw new XamlParseException(SR.Get(SRID.ParserMultiRoot)); } return root; } ////// BamlRecordReader used for Loading the Tree /// internal BamlRecordReader RecordReader { get { return _bamlRecordReader; } set { _bamlRecordReader = value; } } #endif #if !PBTCOMPILER ////// Mode we are loading the file in [....], Async /// internal XamlParseMode XamlParseMode { get { return _xamlParseMode; } set { _xamlParseMode = value; } } ////// Maximum amount of records allowed to read within /// a HandleAsync call /// internal int MaxAsyncRecords { get { return _maxAsyncRecords; } set { _maxAsyncRecords = value; } } ////// flag to indicate a ParseError occured /// internal bool ParseError { get { return _parseException != null; } } ////// Exception that caused the Parse Error /// internal Exception ParseException { get { return _parseException; } set { _parseException = value; } } ////// Flag to indicate that the Parse was Cancelled before the tree was /// completely loaded. /// internal bool ParseCancelled { get { return _parseCancelled; } set { _parseCancelled = value; } } #endif #endregion Properties #region Queuing #if !PBTCOMPILER ////// Post a queue item at default priority /// internal void Post () { Post (DispatcherPriority.Background); } ////// Post a queue item at the specified priority /// internal void Post (DispatcherPriority priority) { DispatcherOperationCallback callback = new DispatcherOperationCallback (Dispatch); Dispatcher.CurrentDispatcher.BeginInvoke(priority, callback, this); } ////// Dispatch delegate /// private object Dispatch (object o) { DispatchParserQueueEvent ((TreeBuilder)o); return null; } private void DispatchParserQueueEvent (TreeBuilder treeBuilder) { treeBuilder.HandleAsyncQueueItem (); } #endif #endregion Queuing #region Data // const int AsyncLoopTimeout = (int)200; #if !PBTCOMPILER BamlRecordReader _bamlRecordReader; XamlParseMode _xamlParseMode; ParserHooks _hooks; bool _parseCancelled; bool _parseStarted; Exception _parseException; int _maxAsyncRecords; #endif #endregion Data } } // 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
- SqlAliaser.cs
- Transform.cs
- CellRelation.cs
- NativeMethods.cs
- TextEditorTables.cs
- ToolStripItemCollection.cs
- SemaphoreFullException.cs
- securitycriticaldataformultiplegetandset.cs
- securitycriticaldataformultiplegetandset.cs
- RelationshipFixer.cs
- OperationPerformanceCounters.cs
- ping.cs
- StoreAnnotationsMap.cs
- UnSafeCharBuffer.cs
- DynamicFilter.cs
- GlyphCache.cs
- ErrorReporting.cs
- XPathBinder.cs
- PropertyInfoSet.cs
- CodeDOMUtility.cs
- Stylesheet.cs
- DataGridViewComboBoxColumn.cs
- HttpWebRequestElement.cs
- RegexReplacement.cs
- RuntimeResourceSet.cs
- CreateWorkflowOwnerCommand.cs
- prompt.cs
- RtfControls.cs
- SqlMetaData.cs
- RepeaterItemCollection.cs
- WindowInteropHelper.cs
- MimeFormatExtensions.cs
- StoreContentChangedEventArgs.cs
- NavigateEvent.cs
- ExceptionUtil.cs
- RewritingProcessor.cs
- cookiecontainer.cs
- Calendar.cs
- IsolatedStorage.cs
- DataGridViewRow.cs
- MsmqChannelListenerBase.cs
- CaseInsensitiveComparer.cs
- SystemIPv4InterfaceProperties.cs
- AddInController.cs
- DeadCharTextComposition.cs
- InternalControlCollection.cs
- RuntimeConfig.cs
- Rotation3DAnimationUsingKeyFrames.cs
- cache.cs
- ThumbAutomationPeer.cs
- ComponentChangingEvent.cs
- SafeFindHandle.cs
- SecurityTokenAuthenticator.cs
- EntityType.cs
- FormatConvertedBitmap.cs
- MetadataProperty.cs
- WindowsTooltip.cs
- TextServicesProperty.cs
- BindingList.cs
- Rect.cs
- FontSource.cs
- CodeTypeReference.cs
- CommandBinding.cs
- IImplicitResourceProvider.cs
- DBBindings.cs
- HtmlHistory.cs
- graph.cs
- UnmanagedBitmapWrapper.cs
- TypedTableBase.cs
- WebConfigurationFileMap.cs
- TextParaLineResult.cs
- RenderingBiasValidation.cs
- SafeHandle.cs
- ApplyTemplatesAction.cs
- FormClosedEvent.cs
- AccessViolationException.cs
- TransactionState.cs
- DropSource.cs
- FixedHyperLink.cs
- PersonalizationEntry.cs
- InstanceData.cs
- InputLanguage.cs
- FlowDecision.cs
- FileSystemEventArgs.cs
- webclient.cs
- TemplateBuilder.cs
- TypeNameConverter.cs
- GetChildSubtree.cs
- QueryPageSettingsEventArgs.cs
- controlskin.cs
- HyperLinkStyle.cs
- BasicBrowserDialog.cs
- Label.cs
- _ConnectOverlappedAsyncResult.cs
- FormViewDeleteEventArgs.cs
- HandlerFactoryCache.cs
- DispatcherHookEventArgs.cs
- XmlNodeChangedEventManager.cs
- SmtpNetworkElement.cs
- ProcessHostServerConfig.cs