Как обернуть Windows.Storage.Streams.IInputStream в интерфейс IInputStream?

Я хочу реализовать IInputStream, который делегирует другому IInputStream и обрабатывает прочитанные данные, прежде чем вернуть их пользователю, например, так:

using System;

using Windows.Storage.Streams;

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;

namespace Core.Crypto {
    public class RC4InputStream : IInputStream {

        public RC4InputStream(IInputStream stream, byte[] readKey) {
            _stream = stream;

            _cipher = new RC4Engine();
            _cipher.Init(false, new KeyParameter(readKey));
        }

        public Windows.Foundation.IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
        {
            var op = _stream.ReadAsync(buffer, count, options);
            // Somehow magically hook up something so that I can call _cipher.ProcessBytes(...)
            return op;
        }

        private readonly IInputStream _stream;
        private readonly IStreamCipher _cipher;
    }
}

У меня есть две разные проблемы, на которые я не смог ответить, обыскивая просторы интернетов:

  • Каков лучший способ связать другую операцию для запуска после делегированного ReadAsync() (я мог бы использовать 'await' и, возможно, создать новую операцию IAsyncOperation с помощью AsyncInfo, но я не знаю, как подключить репортер прогресса и др.)
  • Как мне получить доступ к данным за "IBuffer"?

1 ответ

Решение

Вам нужно будет вернуть свой собственный IAsyncOperationWithProgress, Ты можешь использовать AsyncInfo.Run сделать это:

public IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
{
    return AsyncInfo.Run<IBuffer, uint>(async (token, progress) =>
        {
            progress.Report(0);
            await _stream.ReadAsync(buffer, count, options);
            progress.Report(50);
            // call _cipher.ProcessBytes(...)
            progress.Report(100);
            return buffer;
        });
}

Конечно, вы можете сделать свои собственные отчеты о прогрессе более детальными в зависимости от того, что вы делаете.

Для доступа к данным в IBuffer Вы можете использовать либо ToArray или же AsStream метод расширения.

Другие вопросы по тегам