Как обернуть 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
метод расширения.