IRandomAccessStreams & Streams

Bij het ontwikkelen van Windows Store Apps met C# en Xaml heb je rekening te houden met twee werelden, enerzijds .Net, anderzijds WinRT. Dit zie je op hele veel terreinen terug. Async operaties binnen .Net geven vaak een Task terug, WinRT apis geven een IAsyncOperation terug, binnen .net heb je Stream en in WinRT zijn het IInputStream of IOutputStream. Deze verschillen worden vaak via extension methods

 

Via extension methods worden deze verschillen overbrugt. Hier als voorbeeld van Task naar IAsyncResult:

Task.Run(() => { }).AsAsyncAction();

En in streams kan je het volgende gebruiken: 

Stream s = GetStream();
IInputStream inputStream = s.AsInputStream();
IOutputStream outputStream = s.AsOutputStream();

En ook andersom, dus vanuit WinRT naar .Net types zijn er extension methods beschikbaar:

Stream s1 = inputStream.AsStreamForRead();
Stream s2 = outputStream.AsStreamForWrite();

Echter zijn er ook een flink aantal API's die een IRandomAccessStream verwachten, zoals bijvoorbeeld SetSource method van een Bitmap. Hier heb ik in de API nog geen out-of-the-box oplossing voor gevonden. Gelukkig is een wrapper maken over een memorystream heen die deze interface implementeerd niet heel ingewikkeld:

public class StreamRandomAccessStream : IRandomAccessStream
        {
            private MemoryStream _stream;

            public StreamRandomAccessStream(MemoryStream stream)
            {
                _stream = stream;
            }

            public bool CanRead
            {
                get { return _stream.CanRead; }
            }

            public bool CanWrite
            {
                get { return _stream.CanWrite; }
            }

            public IRandomAccessStream CloneStream()
            {
                var memoryStream = new MemoryStream();
                _stream.CopyTo(memoryStream);
                return new StreamRandomAccessStream(memoryStream);
            }

            public IInputStream GetInputStreamAt(ulong position)
            {
                _stream.Position = (long)position;
                return _stream.AsInputStream();
            }

            public IOutputStream GetOutputStreamAt(ulong position)
            {
                _stream.Position = (long)position;
                return _stream.AsOutputStream();
            }

            public ulong Position
            {
                get { return (ulong)_stream.Position; }
            }

            public void Seek(ulong position)
            {
                _stream.Seek((long)position, SeekOrigin.Begin);
            }

            public ulong Size
            {
                get
                {
                    return (ulong)_stream.Length;
                }
                set
                {
                    _stream.SetLength((long)value);
                }
            }

            public void Dispose()
            {
                _stream.Dispose();
            }

            public IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
            {
                return _stream.AsInputStream().ReadAsync(buffer, count, options);
            }

            public IAsyncOperation<bool> FlushAsync()
            {
                return _stream.AsOutputStream().FlushAsync();
            }

            public IAsyncOperationWithProgress<uint, uint> WriteAsync(IBuffer buffer)
            {
                return _stream.AsOutputStream().WriteAsync(buffer);
            }
  •   RT @alvinashcraft: Getting Started with Lottie-Windows. #xaml #winui #uwp #windowsdev https://t.co/P4EWilrffA
  •   RT @WindowsUI: We are releasing new samples and documentation today showing how to use the compositor's Visual Layer APIs in win32 apps: ht…
  •   RT @JenMsft: @PXAbstraction With the latest version of W10, you can now tie snipping to PrintScreen - lets you capture things that would ot…
  •   RT @JenMsft: It was so fun to talk to the MVPs today about [REDACTED] 😁 #MVPSummit #MVPBuzz
  •   RT @JenMsft: New build for Fast! Look for 18361 - let us know how it goes once you upgrade! Details here: https://t.co/KCrMGkCsCY 😊 #Window…
  •   @JenMsft Plqn to visit 33?
  •   RT @JenMsft: Image support now rolling out for Sticky Notes if you're in Skip Ahead 😊 #WindowsInsiders Details 👉🏻 https://t.co/6IAdzNYeIs…
  •   RT @ClintRutkas: having a great time discussing Windows Development topics at the #mvpSummit. If you feel a community member is a Microsof…
  •   @NicoVermeir revenge is sweet 🤣
  •   @theothernt found a whole dutch delegation at 4am @ starbucks :)