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);
            }
  •   jeej skype till 22h today..
  •   @VSTS @awscloud @chef @Docker @GooglePlay what are the 10 highest rated widgets?
  •   RT @wpschaub: Over 500 extensions in the VSTS/TFS marketplace https://t.co/pH64ZFRi2J
  •   @mitrik what is difference between code -&gt; files -&gt; history and code -&gt; commits? looks as same? https://t.co/NnA8lk1pTe
  •   @LocalJoost 😵
  •   the moment you need to install ms project....
  •   RT @coolcsh: And we have updated Visual Studio 2017 w/15.3 to for .NET Core 2, https://t.co/2y7Qj07QrB Core 2, .NET Standard 2: https://t.c…
  •   @JenMsft do you know what changed in the latest version of the mail app? the whats new web page is not beeing updated for long time..
  •   new windows sdk! https://t.co/qOlWLICyIB #uwp #uwpdev
  •   @tfsbuck this way doesnt take in consideration it can be set back to "new" because some blocking issues?