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 @windowsblog: Windows Template Studio 1.1 released! https://t.co/qCLpESAvnB
  •   @JenMsft and does sqrt(4) - 2 gives now the right awnser?
  •   @Alex_A_Simons any updates on that what more is happening ? (2/2)
  •   @Alex_A_Simons long time ago you said the mess between msa and aad's would be fixed; first step was block to create msa on aad account. (1/2
  •   First pullrequest for https://t.co/5lEHH630Io :)
  •   @qmatteoq whosdown is great alternative for whatapps and comes from the store
  •   @jvintzel only for windows 10 s users or can other surface users get it too?
  •   RT @JenMsft: O hi there @Spotify 😊 #Windows10 https://t.co/nlJUgM7vVG https://t.co/boah802WgZ
  •   RT @tvgrimbergen: Awesome! Just extended our @MicrosoftTeams bot. Provide natural language input to initiate a leave request powered by @Ni…
  •   @lancewmccarthy kind of sad :/