//Copyright 2010 Microsoft Corporation // //Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. //You may obtain a copy of the License at // //http://www.apache.org/licenses/LICENSE-2.0 // //Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an //"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and limitations under the License. namespace System.Data.Services.Common { using System; using System.IO; using System.Xml; using System.Data.Services.Client; internal sealed class EpmCustomContentWriterNodeData : IDisposable { private bool disposed; internal EpmCustomContentWriterNodeData(EpmTargetPathSegment segment, object element) { this.XmlContentStream = new MemoryStream(); XmlWriterSettings customContentWriterSettings = new XmlWriterSettings(); customContentWriterSettings.OmitXmlDeclaration = true; customContentWriterSettings.ConformanceLevel = ConformanceLevel.Fragment; this.XmlContentWriter = XmlWriter.Create(this.XmlContentStream, customContentWriterSettings); this.PopulateData(segment, element); } internal EpmCustomContentWriterNodeData(EpmCustomContentWriterNodeData parentData, EpmTargetPathSegment segment, object element) { this.XmlContentStream = parentData.XmlContentStream; this.XmlContentWriter = parentData.XmlContentWriter; this.PopulateData(segment, element); } internal MemoryStream XmlContentStream { get; private set; } internal XmlWriter XmlContentWriter { get; private set; } internal String Data { get; private set; } public void Dispose() { if (!this.disposed) { if (this.XmlContentWriter != null) { this.XmlContentWriter.Close(); this.XmlContentWriter = null; } if (this.XmlContentStream != null) { this.XmlContentStream.Dispose(); this.XmlContentStream = null; } this.disposed = true; } } internal void AddContentToTarget(XmlWriter target) { this.XmlContentWriter.Close(); this.XmlContentWriter = null; this.XmlContentStream.Seek(0, SeekOrigin.Begin); XmlReaderSettings customContentReaderSettings = new XmlReaderSettings(); customContentReaderSettings.ConformanceLevel = ConformanceLevel.Fragment; XmlReader reader = XmlReader.Create(this.XmlContentStream, customContentReaderSettings); this.XmlContentStream = null; target.WriteNode(reader, false); } private void PopulateData(EpmTargetPathSegment segment, object element) { if (segment.EpmInfo != null) { Object propertyValue; try { propertyValue = segment.EpmInfo.PropValReader.DynamicInvoke(element); } catch (System.Reflection.TargetInvocationException) { throw; } this.Data = propertyValue == null ? String.Empty : ClientConvert.ToString(propertyValue, false ); } } } }