commit
6f2cb0b0d9
|
@ -490,38 +490,13 @@ namespace Emby.Common.Implementations.IO
|
||||||
var temp1 = Path.GetTempFileName();
|
var temp1 = Path.GetTempFileName();
|
||||||
|
|
||||||
// Copying over will fail against hidden files
|
// Copying over will fail against hidden files
|
||||||
RemoveHiddenAttribute(file1);
|
SetHidden(file1, false);
|
||||||
RemoveHiddenAttribute(file2);
|
SetHidden(file2, false);
|
||||||
|
|
||||||
CopyFile(file1, temp1, true);
|
CopyFile(file1, temp1, true);
|
||||||
|
|
||||||
CopyFile(file2, file1, true);
|
CopyFile(file2, file1, true);
|
||||||
CopyFile(temp1, file2, true);
|
CopyFile(temp1, file2, true);
|
||||||
|
|
||||||
DeleteFile(temp1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Removes the hidden attribute.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="path">The path.</param>
|
|
||||||
private void RemoveHiddenAttribute(string path)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(path))
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("path");
|
|
||||||
}
|
|
||||||
|
|
||||||
var currentFile = new FileInfo(path);
|
|
||||||
|
|
||||||
// This will fail if the file is hidden
|
|
||||||
if (currentFile.Exists)
|
|
||||||
{
|
|
||||||
if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
|
|
||||||
{
|
|
||||||
currentFile.Attributes &= ~FileAttributes.Hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ContainsSubPath(string parentPath, string path)
|
public bool ContainsSubPath(string parentPath, string path)
|
||||||
|
|
|
@ -570,9 +570,9 @@ namespace Emby.Server.Implementations.Connect
|
||||||
}
|
}
|
||||||
catch (HttpException ex)
|
catch (HttpException ex)
|
||||||
{
|
{
|
||||||
if (!ex.StatusCode.HasValue)
|
if (!ex.StatusCode.HasValue || ex.IsTimedOut)
|
||||||
{
|
{
|
||||||
throw;
|
throw new Exception("Unable to invite guest, " + ex.Message, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If they entered a username, then whatever the error is just throw it, for example, user not found
|
// If they entered a username, then whatever the error is just throw it, for example, user not found
|
||||||
|
|
|
@ -424,6 +424,9 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Localization\Ratings\us.txt" />
|
<EmbeddedResource Include="Localization\Ratings\us.txt" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="Localization\Ratings\uk.txt" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
|
|
@ -91,16 +91,12 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
|
|
||||||
readonly Dictionary<Type, int> _mapExceptionToStatusCode = new Dictionary<Type, int>
|
readonly Dictionary<Type, int> _mapExceptionToStatusCode = new Dictionary<Type, int>
|
||||||
{
|
{
|
||||||
{typeof (InvalidOperationException), 500},
|
|
||||||
{typeof (NotImplementedException), 500},
|
|
||||||
{typeof (ResourceNotFoundException), 404},
|
{typeof (ResourceNotFoundException), 404},
|
||||||
{typeof (FileNotFoundException), 404},
|
{typeof (FileNotFoundException), 404},
|
||||||
//{typeof (DirectoryNotFoundException), 404},
|
//{typeof (DirectoryNotFoundException), 404},
|
||||||
{typeof (SecurityException), 401},
|
{typeof (SecurityException), 401},
|
||||||
{typeof (PaymentRequiredException), 402},
|
{typeof (PaymentRequiredException), 402},
|
||||||
{typeof (UnauthorizedAccessException), 500},
|
{typeof (ArgumentException), 400}
|
||||||
{typeof (PlatformNotSupportedException), 500},
|
|
||||||
{typeof (NotSupportedException), 500}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public override void Configure()
|
public override void Configure()
|
||||||
|
@ -228,6 +224,22 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int GetStatusCode(Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is ArgumentException)
|
||||||
|
{
|
||||||
|
return 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
int statusCode;
|
||||||
|
if (!_mapExceptionToStatusCode.TryGetValue(ex.GetType(), out statusCode))
|
||||||
|
{
|
||||||
|
statusCode = 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
return statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
private void ErrorHandler(Exception ex, IRequest httpReq, bool logException = true)
|
private void ErrorHandler(Exception ex, IRequest httpReq, bool logException = true)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -244,11 +256,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int statusCode;
|
var statusCode = GetStatusCode(ex);
|
||||||
if (!_mapExceptionToStatusCode.TryGetValue(ex.GetType(), out statusCode))
|
|
||||||
{
|
|
||||||
statusCode = 500;
|
|
||||||
}
|
|
||||||
httpRes.StatusCode = statusCode;
|
httpRes.StatusCode = statusCode;
|
||||||
|
|
||||||
httpRes.ContentType = "text/html";
|
httpRes.ContentType = "text/html";
|
||||||
|
|
7
Emby.Server.Implementations/Localization/Ratings/uk.txt
Normal file
7
Emby.Server.Implementations/Localization/Ratings/uk.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
UK-U,1
|
||||||
|
UK-PG,5
|
||||||
|
UK-12,7
|
||||||
|
UK-12A,7
|
||||||
|
UK-15,9
|
||||||
|
UK-18,10
|
||||||
|
UK-R18,15
|
|
@ -870,33 +870,47 @@ namespace MediaBrowser.Api.Playback
|
||||||
inputChannels = null;
|
inputChannels = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
int? resultChannels = null;
|
int? transcoderChannelLimit = null;
|
||||||
var codec = outputAudioCodec ?? string.Empty;
|
var codec = outputAudioCodec ?? string.Empty;
|
||||||
|
|
||||||
if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1)
|
if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1)
|
||||||
{
|
{
|
||||||
// wmav2 currently only supports two channel output
|
// wmav2 currently only supports two channel output
|
||||||
resultChannels = Math.Min(2, inputChannels ?? 2);
|
transcoderChannelLimit = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (request.MaxAudioChannels.HasValue)
|
else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1)
|
||||||
{
|
{
|
||||||
var channelLimit = codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1
|
// libmp3lame currently only supports two channel output
|
||||||
? 2
|
transcoderChannelLimit = 2;
|
||||||
: 6;
|
}
|
||||||
|
else
|
||||||
if (inputChannels.HasValue)
|
{
|
||||||
{
|
// If we don't have any media info then limit it to 6 to prevent encoding errors due to asking for too many channels
|
||||||
channelLimit = Math.Min(channelLimit, inputChannels.Value);
|
transcoderChannelLimit = 6;
|
||||||
}
|
|
||||||
|
|
||||||
// If we don't have any media info then limit it to 5 to prevent encoding errors due to asking for too many channels
|
|
||||||
resultChannels = Math.Min(request.MaxAudioChannels.Value, channelLimit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.TranscodingMaxAudioChannels.HasValue && !string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
|
var isTranscodingAudio = !string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
int? resultChannels = null;
|
||||||
|
if (isTranscodingAudio)
|
||||||
{
|
{
|
||||||
resultChannels = Math.Min(request.TranscodingMaxAudioChannels.Value, resultChannels ?? inputChannels ?? request.TranscodingMaxAudioChannels.Value);
|
resultChannels = request.TranscodingMaxAudioChannels;
|
||||||
|
}
|
||||||
|
resultChannels = resultChannels ?? request.MaxAudioChannels ?? request.AudioChannels;
|
||||||
|
|
||||||
|
if (inputChannels.HasValue)
|
||||||
|
{
|
||||||
|
resultChannels = resultChannels.HasValue
|
||||||
|
? Math.Min(resultChannels.Value, inputChannels.Value)
|
||||||
|
: inputChannels.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isTranscodingAudio && transcoderChannelLimit.HasValue)
|
||||||
|
{
|
||||||
|
resultChannels = resultChannels.HasValue
|
||||||
|
? Math.Min(resultChannels.Value, transcoderChannelLimit.Value)
|
||||||
|
: transcoderChannelLimit.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultChannels ?? request.AudioChannels;
|
return resultChannels ?? request.AudioChannels;
|
||||||
|
@ -1054,7 +1068,19 @@ namespace MediaBrowser.Api.Playback
|
||||||
|
|
||||||
arg += string.Format(" -canvas_size {0}:{1}", state.VideoStream.Width.Value.ToString(CultureInfo.InvariantCulture), Convert.ToInt32(height).ToString(CultureInfo.InvariantCulture));
|
arg += string.Format(" -canvas_size {0}:{1}", state.VideoStream.Width.Value.ToString(CultureInfo.InvariantCulture), Convert.ToInt32(height).ToString(CultureInfo.InvariantCulture));
|
||||||
}
|
}
|
||||||
arg += " -i \"" + state.SubtitleStream.Path + "\"";
|
|
||||||
|
var subtitlePath = state.SubtitleStream.Path;
|
||||||
|
|
||||||
|
if (string.Equals(Path.GetExtension(subtitlePath), ".sub", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
var idxFile = Path.ChangeExtension(subtitlePath, ".idx");
|
||||||
|
if (FileSystem.FileExists(idxFile))
|
||||||
|
{
|
||||||
|
subtitlePath = idxFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arg += " -i \"" + subtitlePath + "\"";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
|
|
||||||
public string VideoCodec { get; set; }
|
public string VideoCodec { get; set; }
|
||||||
|
|
||||||
|
public int? TranscodingMaxAudioChannels { get; set; }
|
||||||
public int? VideoBitRate { get; set; }
|
public int? VideoBitRate { get; set; }
|
||||||
public int? AudioStreamIndex { get; set; }
|
public int? AudioStreamIndex { get; set; }
|
||||||
public int? VideoStreamIndex { get; set; }
|
public int? VideoStreamIndex { get; set; }
|
||||||
|
@ -86,6 +87,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
MaxVideoBitDepth = info.MaxVideoBitDepth;
|
MaxVideoBitDepth = info.MaxVideoBitDepth;
|
||||||
SubtitleMethod = info.SubtitleDeliveryMethod;
|
SubtitleMethod = info.SubtitleDeliveryMethod;
|
||||||
Context = info.Context;
|
Context = info.Context;
|
||||||
|
TranscodingMaxAudioChannels = info.TranscodingMaxAudioChannels;
|
||||||
|
|
||||||
if (info.SubtitleDeliveryMethod != SubtitleDeliveryMethod.External)
|
if (info.SubtitleDeliveryMethod != SubtitleDeliveryMethod.External)
|
||||||
{
|
{
|
||||||
|
|
|
@ -474,7 +474,19 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
|
|
||||||
arg += string.Format(" -canvas_size {0}:{1}", state.VideoStream.Width.Value.ToString(CultureInfo.InvariantCulture), Convert.ToInt32(height).ToString(CultureInfo.InvariantCulture));
|
arg += string.Format(" -canvas_size {0}:{1}", state.VideoStream.Width.Value.ToString(CultureInfo.InvariantCulture), Convert.ToInt32(height).ToString(CultureInfo.InvariantCulture));
|
||||||
}
|
}
|
||||||
arg += " -i \"" + state.SubtitleStream.Path + "\"";
|
|
||||||
|
var subtitlePath = state.SubtitleStream.Path;
|
||||||
|
|
||||||
|
if (string.Equals(Path.GetExtension(subtitlePath), ".sub", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
var idxFile = Path.ChangeExtension(subtitlePath, ".idx");
|
||||||
|
if (FileSystem.FileExists(idxFile))
|
||||||
|
{
|
||||||
|
subtitlePath = idxFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arg += " -i \"" + subtitlePath + "\"";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -370,30 +370,50 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
inputChannels = null;
|
inputChannels = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int? transcoderChannelLimit = null;
|
||||||
var codec = outputAudioCodec ?? string.Empty;
|
var codec = outputAudioCodec ?? string.Empty;
|
||||||
|
|
||||||
if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1)
|
if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1)
|
||||||
{
|
{
|
||||||
// wmav2 currently only supports two channel output
|
// wmav2 currently only supports two channel output
|
||||||
return Math.Min(2, inputChannels ?? 2);
|
transcoderChannelLimit = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.MaxAudioChannels.HasValue)
|
else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1)
|
||||||
{
|
{
|
||||||
var channelLimit = codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1
|
// libmp3lame currently only supports two channel output
|
||||||
? 2
|
transcoderChannelLimit = 2;
|
||||||
: 6;
|
}
|
||||||
|
else
|
||||||
if (inputChannels.HasValue)
|
{
|
||||||
{
|
// If we don't have any media info then limit it to 6 to prevent encoding errors due to asking for too many channels
|
||||||
channelLimit = Math.Min(channelLimit, inputChannels.Value);
|
transcoderChannelLimit = 6;
|
||||||
}
|
|
||||||
|
|
||||||
// If we don't have any media info then limit it to 5 to prevent encoding errors due to asking for too many channels
|
|
||||||
return Math.Min(request.MaxAudioChannels.Value, channelLimit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return request.AudioChannels;
|
var isTranscodingAudio = !string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
int? resultChannels = null;
|
||||||
|
if (isTranscodingAudio)
|
||||||
|
{
|
||||||
|
resultChannels = request.TranscodingMaxAudioChannels;
|
||||||
|
}
|
||||||
|
resultChannels = resultChannels ?? request.MaxAudioChannels ?? request.AudioChannels;
|
||||||
|
|
||||||
|
if (inputChannels.HasValue)
|
||||||
|
{
|
||||||
|
resultChannels = resultChannels.HasValue
|
||||||
|
? Math.Min(resultChannels.Value, inputChannels.Value)
|
||||||
|
: inputChannels.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isTranscodingAudio && transcoderChannelLimit.HasValue)
|
||||||
|
{
|
||||||
|
resultChannels = resultChannels.HasValue
|
||||||
|
? Math.Min(resultChannels.Value, transcoderChannelLimit.Value)
|
||||||
|
: transcoderChannelLimit.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultChannels ?? request.AudioChannels;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int? GetVideoBitrateParamValue(EncodingJobOptions request, MediaStream videoStream, string outputVideoCodec)
|
private int? GetVideoBitrateParamValue(EncodingJobOptions request, MediaStream videoStream, string outputVideoCodec)
|
||||||
|
|
|
@ -27,7 +27,6 @@ namespace MediaBrowser.Model.Configuration
|
||||||
public bool DisplayMissingEpisodes { get; set; }
|
public bool DisplayMissingEpisodes { get; set; }
|
||||||
public bool DisplayUnairedEpisodes { get; set; }
|
public bool DisplayUnairedEpisodes { get; set; }
|
||||||
|
|
||||||
public string[] ExcludeFoldersFromGrouping { get; set; }
|
|
||||||
public string[] GroupedFolders { get; set; }
|
public string[] GroupedFolders { get; set; }
|
||||||
|
|
||||||
public SubtitlePlaybackMode SubtitleMode { get; set; }
|
public SubtitlePlaybackMode SubtitleMode { get; set; }
|
||||||
|
|
|
@ -37,7 +37,9 @@ namespace OpenSubtitlesHandler
|
||||||
public static IHttpClient HttpClient { get; set; }
|
public static IHttpClient HttpClient { get; set; }
|
||||||
public static ITextEncoding EncodingHelper { get; set; }
|
public static ITextEncoding EncodingHelper { get; set; }
|
||||||
|
|
||||||
private const string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc";
|
//private static string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc";
|
||||||
|
private static string XML_RPC_SERVER = "https://92.240.234.122/xml-rpc";
|
||||||
|
private static string HostHeader = "api.opensubtitles.org:443";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Compute movie hash
|
/// Compute movie hash
|
||||||
|
@ -142,32 +144,6 @@ namespace OpenSubtitlesHandler
|
||||||
public static Stream SendRequest(byte[] request, string userAgent)
|
public static Stream SendRequest(byte[] request, string userAgent)
|
||||||
{
|
{
|
||||||
return SendRequestAsync(request, userAgent, CancellationToken.None).Result;
|
return SendRequestAsync(request, userAgent, CancellationToken.None).Result;
|
||||||
|
|
||||||
//HttpWebRequest req = (HttpWebRequest)WebRequest.Create(XML_RPC_SERVER);
|
|
||||||
//req.ContentType = "text/xml";
|
|
||||||
//req.Host = "api.opensubtitles.org:80";
|
|
||||||
//req.Method = "POST";
|
|
||||||
//req.UserAgent = "xmlrpc-epi-php/0.2 (PHP)";
|
|
||||||
//req.ContentLength = request.Length;
|
|
||||||
//ServicePointManager.Expect100Continue = false;
|
|
||||||
//try
|
|
||||||
//{
|
|
||||||
// using (Stream stm = req.GetRequestStream())
|
|
||||||
// {
|
|
||||||
// stm.Write(request, 0, request.Length);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// WebResponse response = req.GetResponse();
|
|
||||||
// return response.GetResponseStream();
|
|
||||||
//}
|
|
||||||
//catch (Exception ex)
|
|
||||||
//{
|
|
||||||
// Stream errorStream = new MemoryStream();
|
|
||||||
// byte[] dd = Encoding.ASCII.GetBytes("ERROR: " + ex.Message);
|
|
||||||
// errorStream.Write(dd, 0, dd.Length);
|
|
||||||
// errorStream.Position = 0;
|
|
||||||
// return errorStream;
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<Stream> SendRequestAsync(byte[] request, string userAgent, CancellationToken cancellationToken)
|
public static async Task<Stream> SendRequestAsync(byte[] request, string userAgent, CancellationToken cancellationToken)
|
||||||
|
@ -177,7 +153,7 @@ namespace OpenSubtitlesHandler
|
||||||
RequestContentBytes = request,
|
RequestContentBytes = request,
|
||||||
RequestContentType = "text/xml",
|
RequestContentType = "text/xml",
|
||||||
UserAgent = userAgent,
|
UserAgent = userAgent,
|
||||||
Host = "api.opensubtitles.org:443",
|
Host = HostHeader,
|
||||||
Url = XML_RPC_SERVER,
|
Url = XML_RPC_SERVER,
|
||||||
|
|
||||||
// Response parsing will fail with this enabled
|
// Response parsing will fail with this enabled
|
||||||
|
@ -195,32 +171,6 @@ namespace OpenSubtitlesHandler
|
||||||
var result = await HttpClient.Post(options).ConfigureAwait(false);
|
var result = await HttpClient.Post(options).ConfigureAwait(false);
|
||||||
|
|
||||||
return result.Content;
|
return result.Content;
|
||||||
|
|
||||||
//HttpWebRequest req = (HttpWebRequest)WebRequest.Create(XML_RPC_SERVER);
|
|
||||||
//req.ContentType = "text/xml";
|
|
||||||
//req.Host = "api.opensubtitles.org:80";
|
|
||||||
//req.Method = "POST";
|
|
||||||
//req.UserAgent = "xmlrpc-epi-php/0.2 (PHP)";
|
|
||||||
//req.ContentLength = request.Length;
|
|
||||||
//ServicePointManager.Expect100Continue = false;
|
|
||||||
//try
|
|
||||||
//{
|
|
||||||
// using (Stream stm = req.GetRequestStream())
|
|
||||||
// {
|
|
||||||
// stm.Write(request, 0, request.Length);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// WebResponse response = req.GetResponse();
|
|
||||||
// return response.GetResponseStream();
|
|
||||||
//}
|
|
||||||
//catch (Exception ex)
|
|
||||||
//{
|
|
||||||
// Stream errorStream = new MemoryStream();
|
|
||||||
// byte[] dd = Encoding.ASCII.GetBytes("ERROR: " + ex.Message);
|
|
||||||
// errorStream.Write(dd, 0, dd.Length);
|
|
||||||
// errorStream.Position = 0;
|
|
||||||
// return errorStream;
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user