Skip to content

Commit b128ba5

Browse files
committed
Added XML formatter.
1 parent 1da6dbf commit b128ba5

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using Mvc.Datatables.Util;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Net;
7+
using System.Net.Http;
8+
using System.Net.Http.Formatting;
9+
using System.Net.Http.Headers;
10+
using System.Threading.Tasks;
11+
using System.Xml;
12+
using System.Xml.Serialization;
13+
14+
namespace Mvc.Datatables.Formatters
15+
{
16+
public class DatatablesXmlMediaTypeFormatter : MediaTypeFormatter
17+
{
18+
public static readonly string ApplicationDatatablesMediaType = "application/xml+datatables";
19+
public static readonly string TextDatatablesMediaType = "text/xml+datatables";
20+
21+
private readonly ICollection<Type> _knownTypes;
22+
private readonly XmlReaderSettings _readerSettings;
23+
private readonly XmlWriterSettings _writerSettings;
24+
25+
public DatatablesXmlMediaTypeFormatter()
26+
: this(null, null, null) { }
27+
28+
public DatatablesXmlMediaTypeFormatter(ICollection<Type> knownTypes)
29+
: this(knownTypes, null, null) { }
30+
31+
public DatatablesXmlMediaTypeFormatter(XmlReaderSettings readerSettings, XmlWriterSettings writerSettings)
32+
: this(null, readerSettings, writerSettings) { }
33+
34+
public DatatablesXmlMediaTypeFormatter(ICollection<Type> knownTypes, XmlReaderSettings readerSettings, XmlWriterSettings writerSettings)
35+
: base()
36+
{
37+
this.SupportedMediaTypes.Clear();
38+
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue(ApplicationDatatablesMediaType));
39+
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue(TextDatatablesMediaType));
40+
41+
_knownTypes = knownTypes ?? new List<Type>();
42+
_readerSettings = readerSettings ?? new XmlReaderSettings();
43+
_writerSettings = writerSettings ?? new XmlWriterSettings();
44+
}
45+
46+
public static MediaTypeHeaderValue DefaultMediaType
47+
{
48+
get
49+
{
50+
return new MediaTypeHeaderValue(ApplicationDatatablesMediaType);
51+
}
52+
}
53+
54+
public override bool CanReadType(Type type)
55+
{
56+
return type == typeof(FilterRequest) || type.IsSubclassOf(typeof(FilterRequest))
57+
|| type == typeof(PageResponse) || type.IsSubclassOf(typeof(PageResponse));
58+
}
59+
60+
public override bool CanWriteType(Type type)
61+
{
62+
return type == typeof(FilterRequest) || type.IsSubclassOf(typeof(FilterRequest))
63+
|| type == typeof(PageResponse) || type.IsSubclassOf(typeof(PageResponse));
64+
}
65+
66+
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
67+
{
68+
var task = Task<object>.Factory.StartNew(() =>
69+
{
70+
if (type == typeof(PageResponse) || type.IsSubclassOf(typeof(PageResponse)))
71+
{
72+
PageResponse message = Activator.CreateInstance(type) as PageResponse;
73+
Type dataSourceType = message.GetPageResponseArgument();
74+
if (dataSourceType != null && !_knownTypes.Contains(dataSourceType))
75+
_knownTypes.Add(dataSourceType);
76+
}
77+
78+
XmlReader reader = XmlReader.Create(readStream, _readerSettings);
79+
XmlSerializer ser = new XmlSerializer(type, _knownTypes.ToArray());
80+
object val = ser.Deserialize(reader);
81+
return val;
82+
});
83+
84+
return task;
85+
}
86+
87+
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
88+
{
89+
var task = Task.Factory.StartNew(() =>
90+
{
91+
if (value != null)
92+
{
93+
Type objectType = value.GetType();
94+
if (objectType == typeof(PageResponse) || objectType.IsSubclassOf(typeof(PageResponse)))
95+
{
96+
Type dataSourceType = ((PageResponse)value).GetPageResponseArgument();
97+
if (dataSourceType != null && !_knownTypes.Contains(dataSourceType))
98+
_knownTypes.Add(dataSourceType);
99+
}
100+
101+
XmlWriter writer = XmlWriter.Create(writeStream, _writerSettings);
102+
XmlSerializer ser = new XmlSerializer(type, _knownTypes.ToArray());
103+
ser.Serialize(writer, value);
104+
}
105+
});
106+
107+
return task;
108+
}
109+
}
110+
}

0 commit comments

Comments
 (0)