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);
            }
  •   having a fun afternoon with #fluent and #rome ; let see if can make something publishable
  •   RT @pag3rd: If you'll be at #MSIgnite and want to learn about what's new with #XAML #FluentDesign and the brand new #WinUI library come to…
  •   RT @kevintgallo: What’s your favorite color? https://t.co/GvhJIb4ItX
  •   @shanselman @tomasrestrepo @h0x0d @joncaves does it mean @satyanadella holds the mic for you next time at build?
  •   @BNR De eindstand (aangekomen op bestemming) https://t.co/DXxHPP57iy
  •   Toch even aan die conditie werken.. Je weet maar nooit @bnr #fiemibo https://t.co/H61vOPrtVi
  •   RT @donasarkar: Hello #WindowsInsiders we have released 19H1 Build 18242 to Skip Ahead! https://t.co/kuo5Y9jt0i
  •   @BNR Zines de 2 jaar dat ik bij bnr heb gewerkt 😊 #ikhoorbijbnr
  •   @JenMsft is there a way to get notfication mirring from android to win desktop without the cortana app (its not available in netherlands)
  •   @tomverhoeff @bartlannoeye i agree with bart in this.. been seeing enough 'good speakers' just delivering 101 sessions all the time