Version 4.12.2 Dropped Windows.Web.Http.HtpClient

This commit is contained in:
ClemensF 2019-07-13 00:08:56 +02:00
parent 014f57ee1a
commit 9c55597a16
10 changed files with 199 additions and 280 deletions

View file

@ -3,7 +3,6 @@
// Licensed under the Microsoft Public License (Ms-PL)
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
@ -11,13 +10,16 @@ using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Web.Http;
using Windows.Web.Http.Headers;
namespace MapControl
{
public static partial class ImageLoader
{
public static Task<ImageSource> LoadImageAsync(Stream stream)
{
return LoadImageAsync(stream.AsRandomAccessStream());
}
public static async Task<ImageSource> LoadImageAsync(IRandomAccessStream stream)
{
var image = new BitmapImage();
@ -54,68 +56,5 @@ namespace MapControl
return image;
}
private static async Task<ImageSource> LoadImageAsync(IHttpContent content)
{
using (var stream = new InMemoryRandomAccessStream())
{
await content.WriteToStreamAsync(stream);
stream.Seek(0);
return await LoadImageAsync(stream);
}
}
internal class HttpBufferResponse
{
public readonly IBuffer Buffer;
public readonly TimeSpan? MaxAge;
public HttpBufferResponse(IBuffer buffer, TimeSpan? maxAge)
{
Buffer = buffer;
MaxAge = maxAge;
}
}
internal static async Task<HttpBufferResponse> LoadHttpBufferAsync(Uri uri)
{
HttpBufferResponse response = null;
try
{
using (var responseMessage = await HttpClient.GetAsync(uri))
{
if (responseMessage.IsSuccessStatusCode)
{
IBuffer buffer = null;
TimeSpan? maxAge = null;
if (ImageAvailable(responseMessage.Headers))
{
buffer = await responseMessage.Content.ReadAsBufferAsync();
maxAge = responseMessage.Headers.CacheControl?.MaxAge;
}
response = new HttpBufferResponse(buffer, maxAge);
}
else
{
Debug.WriteLine("ImageLoader: {0}: {1} {2}", uri, (int)responseMessage.StatusCode, responseMessage.ReasonPhrase);
}
}
}
catch (Exception ex)
{
Debug.WriteLine("ImageLoader: {0}: {1}", uri, ex.Message);
}
return response;
}
private static bool ImageAvailable(HttpResponseHeaderCollection responseHeaders)
{
return !responseHeaders.TryGetValue("X-VE-Tile-Info", out string tileInfo) || tileInfo != "no-tile";
}
}
}

View file

@ -139,9 +139,6 @@
<Compile Include="..\Shared\TileImageLoader.cs">
<Link>TileImageLoader.cs</Link>
</Compile>
<Compile Include="..\Shared\TileQueue.cs">
<Link>TileQueue.cs</Link>
</Compile>
<Compile Include="..\Shared\TileSource.cs">
<Link>TileSource.cs</Link>
</Compile>

View file

@ -3,6 +3,7 @@
// Licensed under the Microsoft Public License (Ms-PL)
using System;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Storage;
using Windows.Storage.Streams;
@ -35,34 +36,31 @@ namespace MapControl
if (cacheBuffer == null || cacheItem.Expiration < DateTime.UtcNow)
{
var response = await ImageLoader.LoadHttpBufferAsync(uri).ConfigureAwait(false);
if (response != null) // download succeeded
using (var stream = await ImageLoader.LoadImageStreamAsync(uri).ConfigureAwait(false))
{
cacheBuffer = null; // discard cached image
if (response.Buffer != null) // tile image available
if (stream != null) // download succeeded
{
await LoadTileImageAsync(tile, response.Buffer).ConfigureAwait(false);
await Cache.SetAsync(cacheKey, response.Buffer, GetExpiration(response.MaxAge)).ConfigureAwait(false);
cacheBuffer = null; // discard cached image
if (stream.Length > 0) // tile image available
{
await SetTileImageAsync(tile, () => ImageLoader.LoadImageAsync(stream)).ConfigureAwait(false);
await Cache.SetAsync(cacheKey, stream.ToArray().AsBuffer(), GetExpiration(stream.MaxAge)).ConfigureAwait(false);
}
}
}
}
if (cacheBuffer != null) // cached image not expired or download failed
{
await LoadTileImageAsync(tile, cacheBuffer).ConfigureAwait(false);
}
}
using (var stream = new InMemoryRandomAccessStream())
{
await stream.WriteAsync(cacheBuffer);
stream.Seek(0);
private static async Task LoadTileImageAsync(Tile tile, IBuffer buffer)
{
using (var stream = new InMemoryRandomAccessStream())
{
await stream.WriteAsync(buffer);
stream.Seek(0);
await SetTileImageAsync(tile, () => ImageLoader.LoadImageAsync(stream)).ConfigureAwait(false);
await SetTileImageAsync(tile, () => ImageLoader.LoadImageAsync(stream)).ConfigureAwait(false);
}
}
}