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 }