[runtime] Overwrite stacktrace for exception on re-throw. Fixes #1856.
[mono.git] / mcs / class / System.ServiceModel.Web / System.ServiceModel.Syndication / XmlSyndicationContent.cs
1 //
2 // XmlSyndicationContent.cs
3 //
4 // Author:
5 //      Atsushi Enomoto  <atsushi@ximian.com>
6 //
7 // Copyright (C) 2007 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 using System;
29 using System.Collections.Generic;
30 using System.Collections.ObjectModel;
31 using System.IO;
32 using System.Runtime.Serialization;
33 using System.Text;
34 using System.Xml;
35 using System.Xml.Serialization;
36
37 namespace System.ServiceModel.Syndication
38 {
39         public class XmlSyndicationContent : SyndicationContent
40         {
41                 SyndicationElementExtension writer_extension, reader_extension;
42                 string type;
43
44                 public XmlSyndicationContent (XmlReader reader)
45                 {
46                         if (reader == null)
47                                 throw new ArgumentNullException ("reader");
48                         this.type = reader.GetAttribute ("type");
49                         reader_extension = new SyndicationElementExtension (reader);
50                 }
51
52                 public XmlSyndicationContent (string type, object dataContractExtension, XmlObjectSerializer dataContractSerializer)
53                 {
54                         this.type = type;
55                         writer_extension = new SyndicationElementExtension (dataContractExtension, dataContractSerializer);
56                 }
57
58                 public XmlSyndicationContent (string type, object xmlSerializerExtension, XmlSerializer serializer)
59                 {
60                         this.type = type;
61                         writer_extension = new SyndicationElementExtension (xmlSerializerExtension, serializer);
62                 }
63
64                 public XmlSyndicationContent (string type, SyndicationElementExtension extension)
65                 {
66                         this.type = type;
67                         if (extension == null)
68                                 throw new ArgumentNullException ("extension");
69                         this.writer_extension = extension;
70                 }
71
72                 protected XmlSyndicationContent (XmlSyndicationContent source)
73                 {
74                         if (source == null)
75                                 throw new ArgumentNullException ("source");
76                         type = source.type;
77                         writer_extension = source.writer_extension;
78                         reader_extension = source.reader_extension;
79                 }
80
81                 public override SyndicationContent Clone ()
82                 {
83                         return new XmlSyndicationContent (this);
84                 }
85
86                 SyndicationElementExtension extension {
87                         get { return writer_extension ?? reader_extension; }
88                 }
89
90                 public XmlDictionaryReader GetReaderAtContent ()
91                 {
92                         if (writer_extension != null) {
93                                 // It is messy, but it somehow returns an XmlReader that has wrapper "content" element for non-XmlReader extension...
94                                 XmlReader r = extension.GetReader ();
95                                 if (!(r is XmlDictionaryReader))
96                                         r = XmlDictionaryReader.CreateDictionaryReader (r);
97                                 var ms = new MemoryStream ();
98                                 var xw = XmlDictionaryWriter.CreateBinaryWriter (ms);
99                                 xw.WriteStartElement ("content", Namespaces.Atom10);
100                                 xw.WriteAttributeString ("type", "text/xml");
101                                 while (!r.EOF)
102                                         xw.WriteNode (r, false);
103                                 xw.WriteEndElement ();
104                                 xw.Close ();
105                                 ms.Position = 0;
106                                 var xr = XmlDictionaryReader.CreateBinaryReader (ms, new XmlDictionaryReaderQuotas ());
107                                 xr.MoveToContent ();
108                                 return xr;
109                         } else {
110                                 XmlReader r = extension.GetReader ();
111                                 if (!(r is XmlDictionaryReader))
112                                         r = XmlDictionaryReader.CreateDictionaryReader (r);
113                                 return (XmlDictionaryReader) r;
114                         }
115                 }
116
117                 public TContent ReadContent<TContent> ()
118                 {
119                         return extension.GetObject<TContent> ();
120                 }
121
122                 public TContent ReadContent<TContent> (XmlObjectSerializer serializer)
123                 {
124                         return extension.GetObject<TContent> (serializer);
125                 }
126
127                 public TContent ReadContent<TContent> (XmlSerializer serializer)
128                 {
129                         return extension.GetObject<TContent> (serializer);
130                 }
131
132                 protected override void WriteContentsTo (XmlWriter writer)
133                 {
134                         if (reader_extension != null) {
135                                 // It is messy, but it somehow skips the wrapper element...
136                                 var xr = extension.GetReader ();
137                                 if (xr.IsEmptyElement)
138                                         xr.Read ();
139                                 else {
140                                         xr.ReadStartElement (); // skip it
141                                         while (xr.NodeType != XmlNodeType.EndElement) {
142                                                 writer.WriteNode (xr, false);
143                                         }
144                                         xr.ReadEndElement ();
145                                 }
146                         }
147                         else
148                                 extension.WriteTo (writer);
149                 }
150
151                 public SyndicationElementExtension Extension {
152                         get { return writer_extension; }
153                 }
154
155                 public override string Type {
156                         get { return type ?? "text/xml"; }
157                 }
158         }
159 }