1 //Copyright 2010 Microsoft Corporation 2 // 3 //Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. 4 //You may obtain a copy of the License at 5 // 6 //http://www.apache.org/licenses/LICENSE-2.0 7 // 8 //Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an 9 //"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 //See the License for the specific language governing permissions and limitations under the License. 11 12 13 namespace System.Data.Services.Common 14 { 15 using System; 16 using System.IO; 17 using System.Xml; 18 using System.Data.Services.Client; 19 20 internal sealed class EpmCustomContentWriterNodeData : IDisposable 21 { 22 private bool disposed; 23 EpmCustomContentWriterNodeData(EpmTargetPathSegment segment, object element)24 internal EpmCustomContentWriterNodeData(EpmTargetPathSegment segment, object element) 25 { 26 this.XmlContentStream = new MemoryStream(); 27 XmlWriterSettings customContentWriterSettings = new XmlWriterSettings(); 28 customContentWriterSettings.OmitXmlDeclaration = true; 29 customContentWriterSettings.ConformanceLevel = ConformanceLevel.Fragment; 30 this.XmlContentWriter = XmlWriter.Create(this.XmlContentStream, customContentWriterSettings); 31 this.PopulateData(segment, element); 32 } 33 EpmCustomContentWriterNodeData(EpmCustomContentWriterNodeData parentData, EpmTargetPathSegment segment, object element)34 internal EpmCustomContentWriterNodeData(EpmCustomContentWriterNodeData parentData, EpmTargetPathSegment segment, object element) 35 { 36 this.XmlContentStream = parentData.XmlContentStream; 37 this.XmlContentWriter = parentData.XmlContentWriter; 38 this.PopulateData(segment, element); 39 40 } 41 42 internal MemoryStream XmlContentStream 43 { 44 get; 45 private set; 46 } 47 48 internal XmlWriter XmlContentWriter 49 { 50 get; 51 private set; 52 } 53 54 internal String Data 55 { 56 get; 57 private set; 58 } 59 Dispose()60 public void Dispose() 61 { 62 if (!this.disposed) 63 { 64 if (this.XmlContentWriter != null) 65 { 66 this.XmlContentWriter.Close(); 67 this.XmlContentWriter = null; 68 } 69 70 if (this.XmlContentStream != null) 71 { 72 this.XmlContentStream.Dispose(); 73 this.XmlContentStream = null; 74 } 75 76 this.disposed = true; 77 } 78 } 79 AddContentToTarget(XmlWriter target)80 internal void AddContentToTarget(XmlWriter target) 81 { 82 this.XmlContentWriter.Close(); 83 this.XmlContentWriter = null; 84 this.XmlContentStream.Seek(0, SeekOrigin.Begin); 85 XmlReaderSettings customContentReaderSettings = new XmlReaderSettings(); 86 customContentReaderSettings.ConformanceLevel = ConformanceLevel.Fragment; 87 XmlReader reader = XmlReader.Create(this.XmlContentStream, customContentReaderSettings); 88 this.XmlContentStream = null; 89 target.WriteNode(reader, false); 90 } 91 PopulateData(EpmTargetPathSegment segment, object element)92 private void PopulateData(EpmTargetPathSegment segment, object element) 93 { 94 if (segment.EpmInfo != null) 95 { 96 Object propertyValue; 97 98 try 99 { 100 propertyValue = segment.EpmInfo.PropValReader.DynamicInvoke(element); 101 102 } 103 catch 104 (System.Reflection.TargetInvocationException) 105 { 106 throw; 107 } 108 109 this.Data = propertyValue == null ? String.Empty : ClientConvert.ToString(propertyValue, false ); 110 111 } 112 } 113 } 114 }