File: System\Activities\XamlIntegration\XamlWriterExtensions.cs
Project: ndp\cdf\src\NetFx40\System.Activities\System.Activities.csproj (System.Activities)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
 
namespace System.Activities.XamlIntegration
{
    using System;
    using System.Xaml;
    using System.Runtime;
 
    static class XamlWriterExtensions
    {
        public static void PropagateLineInfo(XamlWriter targetWriter, IXamlLineInfo lineInfo)
        {
            if (lineInfo != null)
            {
                IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;            
                Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
                consumer.SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition);                
            }
        }
 
        public static void PropagateLineInfo(XamlWriter targetWriter, int lineNumber, int linePosition)
        {
            IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;
            Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
            consumer.SetLineInfo(lineNumber, linePosition);
        }
        
        // This method is a workaround for TFS bug #788190, since XamlReader.ReadSubtree() should (but doesn't) preserve IXamlLineInfo on the subreader
        public static void Transform(XamlReader reader, XamlWriter writer, IXamlLineInfo readerLineInfo, bool closeWriter)
        {
            IXamlLineInfoConsumer consumer = writer as IXamlLineInfoConsumer;
            Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
            bool shouldPassLineNumberInfo = false;
            if (readerLineInfo != null)
            {
                shouldPassLineNumberInfo = true;
            }
 
            while (reader.Read())
            {
                if (shouldPassLineNumberInfo)
                {
                    consumer.SetLineInfo(readerLineInfo.LineNumber, readerLineInfo.LinePosition);                    
                }
                writer.WriteNode(reader);
            }
 
            if (closeWriter)
            {
                writer.Close();
            }
        }
        
        public static void WriteNode(this XamlWriter writer, XamlReader reader, IXamlLineInfo lineInfo) 
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteNode(reader);
        }
                
        public static void WriteEndMember(this XamlWriter writer, IXamlLineInfo lineInfo)
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteEndMember();
        }
 
        public static void WriteEndObject(this XamlWriter writer, IXamlLineInfo lineInfo)
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteEndObject();
        }
 
        public static void WriteGetObject(this XamlWriter writer, IXamlLineInfo lineInfo)
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteGetObject();
        }
 
        public static void WriteNamespace(this XamlWriter writer, NamespaceDeclaration namespaceDeclaration, IXamlLineInfo lineInfo)
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteNamespace(namespaceDeclaration);
        }
 
        public static void WriteStartMember(this XamlWriter writer, XamlMember xamlMember, IXamlLineInfo lineInfo)
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteStartMember(xamlMember);
        }
 
        public static void WriteStartMember(this XamlWriter writer, XamlMember xamlMember, int lineNumber, int linePosition)
        {
            PropagateLineInfo(writer, lineNumber, linePosition);
            writer.WriteStartMember(xamlMember);
        }
 
        public static void WriteStartObject(this XamlWriter writer, XamlType type, IXamlLineInfo lineInfo)
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteStartObject(type);
        }
 
        public static void WriteValue(this XamlWriter writer, object value, IXamlLineInfo lineInfo)
        {
            PropagateLineInfo(writer, lineInfo);
            writer.WriteValue(value);
        }
    }
}