Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- DecodeHelper.cs
- SymmetricKeyWrap.cs
- DBConnection.cs
- ValueProviderWrapper.cs
- MultiByteCodec.cs
- ApplicationBuildProvider.cs
- FormatterServices.cs
- TableLayoutPanelBehavior.cs
- RuntimeConfig.cs
- CodeAttributeArgument.cs
- PreloadedPackages.cs
- MonthCalendar.cs
- HttpProfileBase.cs
- ComplexBindingPropertiesAttribute.cs
- GridView.cs
- InputBindingCollection.cs
- MimeTypeAttribute.cs
- ProgressiveCrcCalculatingStream.cs
- SwitchElementsCollection.cs
- DbConnectionHelper.cs
- ResourcePool.cs
- RotateTransform.cs
- DesignerCapabilities.cs
- AccessDataSource.cs
- QilTypeChecker.cs
- ConditionValidator.cs
- TraceAsyncResult.cs
- SynchronizedPool.cs
- XmlSchemaInferenceException.cs
- SymbolMethod.cs
- ClientRequest.cs
- UnionQueryOperator.cs
- GeometryDrawing.cs
- ActivationServices.cs
- PointAnimationClockResource.cs
- RadioButtonBaseAdapter.cs
- IndicCharClassifier.cs
- SelectionHighlightInfo.cs
- CLSCompliantAttribute.cs
- CancelRequestedRecord.cs
- InputLanguageEventArgs.cs
- HtmlInputFile.cs
- InvokeMethodActivity.cs
- BitmapImage.cs
- FacetValues.cs
- DataGridViewTopLeftHeaderCell.cs
- SectionXmlInfo.cs
- ping.cs
- BufferedStream2.cs
- DrawingContextWalker.cs
- infer.cs
- XmlSchemaInclude.cs
- ListItemViewControl.cs
- BinaryCommonClasses.cs
- Journaling.cs
- EventSinkHelperWriter.cs
- UniqueConstraint.cs
- GeneralTransform3DGroup.cs
- ClipboardProcessor.cs
- StandardMenuStripVerb.cs
- FormViewCommandEventArgs.cs
- TimeEnumHelper.cs
- ClientUtils.cs
- FontConverter.cs
- Zone.cs
- LinqDataSourceInsertEventArgs.cs
- SectionRecord.cs
- ChannelServices.cs
- TextBoxAutoCompleteSourceConverter.cs
- FontFamilyConverter.cs
- CalendarDay.cs
- FileChangesMonitor.cs
- OracleParameterCollection.cs
- CalendarDateRange.cs
- WorkflowEventArgs.cs
- UpDownBase.cs
- TagMapCollection.cs
- ItemMap.cs
- _NtlmClient.cs
- AsyncDataRequest.cs
- ObjectItemAttributeAssemblyLoader.cs
- XmlTextReaderImpl.cs
- SqlClientPermission.cs
- OleDbException.cs
- DefaultAuthorizationContext.cs
- EncryptedKeyHashIdentifierClause.cs
- KeyToListMap.cs
- ExtendedProtectionPolicyElement.cs
- SerializableAttribute.cs
- ConversionHelper.cs
- WeakEventTable.cs
- Vector3DValueSerializer.cs
- X509LogoTypeExtension.cs
- SafeNativeMethods.cs
- DescendentsWalker.cs
- ObjectDataSourceView.cs
- FileUtil.cs
- SqlProviderServices.cs
- SchemaUtility.cs
- RestHandler.cs