Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / System / Windows / Markup / XamlTreeBuilderBamlRecordWriter.cs / 1 / XamlTreeBuilderBamlRecordWriter.cs
/****************************************************************************\
*
* File: XamlTreeBuilderBamlRecordWriter.cs
*
* Purpose: Class that writes baml records when building a tree directly
* from xaml
*
* History:
* 6/06/01: rogerg Created
* 5/29/03: peterost Ported to wcp
* 11/13/03: peterost split from XamlTreeBuilder.cs
*
* Copyright (C) 2003 by Microsoft Corporation. All rights reserved.
*
\***************************************************************************/
using System;
using System.Xml;
using System.IO;
using System.Windows;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Threading;
using MS.Utility;
namespace System.Windows.Markup
{
///
/// Override class for BamlRecordWriter when building tree Directly from XAML.
/// We do this so in the [....] case we can build the tree directly instead
/// of writing to a BAMLStream. Note that building a tree directly from xaml
/// DOES NOT support defer loaded content
///
internal class XamlTreeBuilderBamlRecordWriter : BamlRecordWriter
{
#region Constructors
internal XamlTreeBuilderBamlRecordWriter(
XamlTreeBuilder treeBuilder,
Stream stream,
ParserContext parserContext,
bool isSerializer )
: base(stream,parserContext,false)
{
_treeBuilder = treeBuilder;
_writerStream = stream as WriterStream;
// If we're in a nested parser, then we need to track it in our
// _customSerializerNestingLevel counter. Otherwise we'll flush
// Baml records to the reader thread too soon in WriteBamlRecord.
if( isSerializer )
{
_customSerializerNestingLevel = 1;
}
Debug.Assert(null != _writerStream,"Stream for Writer is not a WriterStream");
}
#endregion Constructors
#region Overrides
internal override void WriteBamlRecord(
BamlRecord bamlRecord,
int lineNumber,
int linePosition)
{
bool bamlRecordHandled = false;
// Try to load the Baml record. This will work if we're in [....] mode
// (default case), or if we're in async mode and processing the root.
bamlRecordHandled = TreeBuilder.BamlRecordWriterSyncUpdate(bamlRecord,
lineNumber, linePosition);
// If it didn't get handled, write the baml record to the baml stream.
if (!bamlRecordHandled)
{
// Write the record.
base.WriteBamlRecord(bamlRecord, lineNumber, linePosition);
// Nowe we see if we can let the reader see this record. We can't if we're within
// a custom serializer. (This was added so that templates & styles wouldn't get sealed
// before being fully loaded, an alternative would be to use ISupportInitialize.)
// Is this a start record?
BamlElementStartRecord bamlElementStartRecord = bamlRecord as BamlElementStartRecord;
if (bamlElementStartRecord != null)
{
// Yes, it's a start record. If we're not already under a custom serializer,
// but this element has one, then start nesting.
if (_customSerializerNestingLevel == 0
&&
MapTable.HasSerializerForTypeId(bamlElementStartRecord.TypeId))
{
_customSerializerNestingLevel = 1;
}
// Or, if we're already under a custom serializer, increment the nesting level.
else if (_customSerializerNestingLevel > 0)
{
++_customSerializerNestingLevel;
}
}
// This isn't a start record. But if we're under a custom serializer,
// we might need to update the nesting level.
else if (_customSerializerNestingLevel != 0)
{
// If this is an end element record, decrement the nesting level.
BamlElementEndRecord bamlElementEndRecord = bamlRecord as BamlElementEndRecord;
if (bamlElementEndRecord != null)
{
--_customSerializerNestingLevel;
}
}
// If we're not (now) under a custom serializer context, tell the reader
// about all of the records we've written.
if (_customSerializerNestingLevel == 0)
{
WriterStream.UpdateReaderLength(WriterStream.Length );
}
}
}
///
/// sets the number of Records that can be read at a time
/// in async mode. main use is for debugging.
///
/// number of Records we are allowed to read
internal override void SetMaxAsyncRecords(int maxAsyncRecords)
{
TreeBuilder.MaxAsyncRecords = maxAsyncRecords;
}
///
/// Called to determine if it is okay for ParentNodes to be updated
/// since building the tree directly we can't seek back to update
/// the parent nodes so false is always returned.
///
internal override bool UpdateParentNodes
{
get
{
return false;
}
}
// If building a tree directly, just store the strings directly in the BAML record.
// Don't have to precreate the DP object, stream it out and then re-create it as this
// is extra work, so custom serialization is not allowed.
internal override void WriteProperty(XamlPropertyNode xamlPropertyNode)
{
BaseWriteProperty(xamlPropertyNode);
}
#endregion Overrides
#region Properties
///
/// TreeBuilder associated with this class
///
internal XamlTreeBuilder TreeBuilder
{
get { return _treeBuilder; }
}
///
/// Writer stream records are written to.
/// Hold onto this so we can updateThe Reader length to keep the
/// BamlRecords class unaware of the ReaderWriter Stream
///
private WriterStream WriterStream
{
get { return _writerStream; }
}
///
/// When creating a tree directly from Xaml, use the record reader's
/// BamlRecordManager, since its record releasing behavior is modified
/// based on the markup it is reading in
///
internal override BamlRecordManager BamlRecordManager
{
get { return _treeBuilder.RecordReader.BamlRecordManager; }
}
#endregion Properties
#region Data
XamlTreeBuilder _treeBuilder;
WriterStream _writerStream;
int _customSerializerNestingLevel = 0;
#endregion Data
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
/****************************************************************************\
*
* File: XamlTreeBuilderBamlRecordWriter.cs
*
* Purpose: Class that writes baml records when building a tree directly
* from xaml
*
* History:
* 6/06/01: rogerg Created
* 5/29/03: peterost Ported to wcp
* 11/13/03: peterost split from XamlTreeBuilder.cs
*
* Copyright (C) 2003 by Microsoft Corporation. All rights reserved.
*
\***************************************************************************/
using System;
using System.Xml;
using System.IO;
using System.Windows;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Threading;
using MS.Utility;
namespace System.Windows.Markup
{
///
/// Override class for BamlRecordWriter when building tree Directly from XAML.
/// We do this so in the [....] case we can build the tree directly instead
/// of writing to a BAMLStream. Note that building a tree directly from xaml
/// DOES NOT support defer loaded content
///
internal class XamlTreeBuilderBamlRecordWriter : BamlRecordWriter
{
#region Constructors
internal XamlTreeBuilderBamlRecordWriter(
XamlTreeBuilder treeBuilder,
Stream stream,
ParserContext parserContext,
bool isSerializer )
: base(stream,parserContext,false)
{
_treeBuilder = treeBuilder;
_writerStream = stream as WriterStream;
// If we're in a nested parser, then we need to track it in our
// _customSerializerNestingLevel counter. Otherwise we'll flush
// Baml records to the reader thread too soon in WriteBamlRecord.
if( isSerializer )
{
_customSerializerNestingLevel = 1;
}
Debug.Assert(null != _writerStream,"Stream for Writer is not a WriterStream");
}
#endregion Constructors
#region Overrides
internal override void WriteBamlRecord(
BamlRecord bamlRecord,
int lineNumber,
int linePosition)
{
bool bamlRecordHandled = false;
// Try to load the Baml record. This will work if we're in [....] mode
// (default case), or if we're in async mode and processing the root.
bamlRecordHandled = TreeBuilder.BamlRecordWriterSyncUpdate(bamlRecord,
lineNumber, linePosition);
// If it didn't get handled, write the baml record to the baml stream.
if (!bamlRecordHandled)
{
// Write the record.
base.WriteBamlRecord(bamlRecord, lineNumber, linePosition);
// Nowe we see if we can let the reader see this record. We can't if we're within
// a custom serializer. (This was added so that templates & styles wouldn't get sealed
// before being fully loaded, an alternative would be to use ISupportInitialize.)
// Is this a start record?
BamlElementStartRecord bamlElementStartRecord = bamlRecord as BamlElementStartRecord;
if (bamlElementStartRecord != null)
{
// Yes, it's a start record. If we're not already under a custom serializer,
// but this element has one, then start nesting.
if (_customSerializerNestingLevel == 0
&&
MapTable.HasSerializerForTypeId(bamlElementStartRecord.TypeId))
{
_customSerializerNestingLevel = 1;
}
// Or, if we're already under a custom serializer, increment the nesting level.
else if (_customSerializerNestingLevel > 0)
{
++_customSerializerNestingLevel;
}
}
// This isn't a start record. But if we're under a custom serializer,
// we might need to update the nesting level.
else if (_customSerializerNestingLevel != 0)
{
// If this is an end element record, decrement the nesting level.
BamlElementEndRecord bamlElementEndRecord = bamlRecord as BamlElementEndRecord;
if (bamlElementEndRecord != null)
{
--_customSerializerNestingLevel;
}
}
// If we're not (now) under a custom serializer context, tell the reader
// about all of the records we've written.
if (_customSerializerNestingLevel == 0)
{
WriterStream.UpdateReaderLength(WriterStream.Length );
}
}
}
///
/// sets the number of Records that can be read at a time
/// in async mode. main use is for debugging.
///
/// number of Records we are allowed to read
internal override void SetMaxAsyncRecords(int maxAsyncRecords)
{
TreeBuilder.MaxAsyncRecords = maxAsyncRecords;
}
///
/// Called to determine if it is okay for ParentNodes to be updated
/// since building the tree directly we can't seek back to update
/// the parent nodes so false is always returned.
///
internal override bool UpdateParentNodes
{
get
{
return false;
}
}
// If building a tree directly, just store the strings directly in the BAML record.
// Don't have to precreate the DP object, stream it out and then re-create it as this
// is extra work, so custom serialization is not allowed.
internal override void WriteProperty(XamlPropertyNode xamlPropertyNode)
{
BaseWriteProperty(xamlPropertyNode);
}
#endregion Overrides
#region Properties
///
/// TreeBuilder associated with this class
///
internal XamlTreeBuilder TreeBuilder
{
get { return _treeBuilder; }
}
///
/// Writer stream records are written to.
/// Hold onto this so we can updateThe Reader length to keep the
/// BamlRecords class unaware of the ReaderWriter Stream
///
private WriterStream WriterStream
{
get { return _writerStream; }
}
///
/// When creating a tree directly from Xaml, use the record reader's
/// BamlRecordManager, since its record releasing behavior is modified
/// based on the markup it is reading in
///
internal override BamlRecordManager BamlRecordManager
{
get { return _treeBuilder.RecordReader.BamlRecordManager; }
}
#endregion Properties
#region Data
XamlTreeBuilder _treeBuilder;
WriterStream _writerStream;
int _customSerializerNestingLevel = 0;
#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
- TypeSemantics.cs
- GlyphsSerializer.cs
- ParameterCollection.cs
- Int32Rect.cs
- SvcMapFile.cs
- _HeaderInfoTable.cs
- SortKey.cs
- _AuthenticationState.cs
- Stylesheet.cs
- IdentityReference.cs
- AppliedDeviceFiltersDialog.cs
- CombinedGeometry.cs
- WorkflowItemsPresenter.cs
- UICuesEvent.cs
- DbMetaDataColumnNames.cs
- ContentType.cs
- UnknownBitmapEncoder.cs
- SerialReceived.cs
- XsdCachingReader.cs
- WebPartTransformerAttribute.cs
- DeclarativeConditionsCollection.cs
- MemberCollection.cs
- XmlSchemaIdentityConstraint.cs
- TextBoxLine.cs
- RectangleConverter.cs
- StorageRoot.cs
- OpacityConverter.cs
- CodePageUtils.cs
- FindSimilarActivitiesVerb.cs
- RSAOAEPKeyExchangeFormatter.cs
- WindowsFormsHostAutomationPeer.cs
- XmlNodeChangedEventArgs.cs
- AddInServer.cs
- dataprotectionpermission.cs
- TagMapCollection.cs
- bidPrivateBase.cs
- AmbientValueAttribute.cs
- SourceSwitch.cs
- CompilerResults.cs
- ConfigsHelper.cs
- ViewBase.cs
- DataBoundControlAdapter.cs
- RepeaterCommandEventArgs.cs
- ScrollEventArgs.cs
- DesignerCatalogPartChrome.cs
- CodePageEncoding.cs
- DataListGeneralPage.cs
- COM2ExtendedUITypeEditor.cs
- ClipboardProcessor.cs
- ThemeDictionaryExtension.cs
- OneOfScalarConst.cs
- PolicyStatement.cs
- XmlnsCompatibleWithAttribute.cs
- MethodExpr.cs
- _SecureChannel.cs
- CodeMemberMethod.cs
- ThemeableAttribute.cs
- IISUnsafeMethods.cs
- ImportCatalogPart.cs
- WebPartPersonalization.cs
- HtmlTableCell.cs
- NetNamedPipeSecurityElement.cs
- OpCodes.cs
- ByteArrayHelperWithString.cs
- XsdDataContractExporter.cs
- WmiEventSink.cs
- CommandCollectionEditor.cs
- RewritingProcessor.cs
- ControlValuePropertyAttribute.cs
- CompilationLock.cs
- DispatchWrapper.cs
- OptimizerPatterns.cs
- MessageSecurityTokenVersion.cs
- AuthorizationSection.cs
- ProcessHost.cs
- DataGridViewRowPostPaintEventArgs.cs
- DiscardableAttribute.cs
- EventToken.cs
- OptimisticConcurrencyException.cs
- ResXFileRef.cs
- DataList.cs
- ManagementObjectCollection.cs
- ObjectReaderCompiler.cs
- TableItemProviderWrapper.cs
- HttpClientCertificate.cs
- HtmlLink.cs
- ProfilePropertyNameValidator.cs
- basevalidator.cs
- ScriptReference.cs
- XamlLoadErrorInfo.cs
- RsaSecurityTokenParameters.cs
- UnsafeNativeMethods.cs
- DateTimeOffsetConverter.cs
- BaseCodeDomTreeGenerator.cs
- CreateUserWizard.cs
- StylusSystemGestureEventArgs.cs
- __TransparentProxy.cs
- configsystem.cs
- VisualCollection.cs
- FamilyMapCollection.cs