using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Serialization;
using System;
using System.IO;
using System.Threading.Tasks;
namespace MediaBrowser.Common.Net.Handlers
{
///
/// Class BaseSerializationHandler
///
/// The type of the T kernel type.
///
public abstract class BaseSerializationHandler : BaseHandler
where TKernelType : IKernel
where T : class
{
///
/// Gets the serialization format.
///
/// The serialization format.
public SerializationFormat SerializationFormat
{
get
{
var format = QueryString["dataformat"];
if (string.IsNullOrEmpty(format))
{
return SerializationFormat.Json;
}
return (SerializationFormat)Enum.Parse(typeof(SerializationFormat), format, true);
}
}
///
/// Gets the type of the content.
///
/// The type of the content.
protected string ContentType
{
get
{
switch (SerializationFormat)
{
case SerializationFormat.Protobuf:
return "application/x-protobuf";
default:
return MimeTypes.JsonMimeType;
}
}
}
///
/// Gets the response info.
///
/// Task{ResponseInfo}.
protected override Task GetResponseInfo()
{
return Task.FromResult(new ResponseInfo
{
ContentType = ContentType
});
}
///
/// Called when [processing request].
///
/// The response info.
/// Task.
protected override async Task OnProcessingRequest(ResponseInfo responseInfo)
{
_objectToSerialize = await GetObjectToSerialize().ConfigureAwait(false);
if (_objectToSerialize == null)
{
throw new ResourceNotFoundException();
}
await base.OnProcessingRequest(responseInfo).ConfigureAwait(false);
}
///
/// The _object to serialize
///
private T _objectToSerialize;
///
/// Gets the object to serialize.
///
/// Task{`0}.
protected abstract Task GetObjectToSerialize();
///
/// Writes the response to output stream.
///
/// The stream.
/// The response info.
/// Length of the content.
/// Task.
protected override Task WriteResponseToOutputStream(Stream stream, ResponseInfo responseInfo, long? contentLength)
{
return Task.Run(() =>
{
switch (SerializationFormat)
{
case SerializationFormat.Protobuf:
Kernel.ProtobufSerializer.SerializeToStream(_objectToSerialize, stream);
break;
default:
JsonSerializer.SerializeToStream(_objectToSerialize, stream);
break;
}
});
}
}
///
/// Enum SerializationFormat
///
public enum SerializationFormat
{
///
/// The json
///
Json,
///
/// The protobuf
///
Protobuf
}
}