| #pragma once |
| |
| #include <ppl.h> |
| #include <ppltasks.h> |
| #include <wrl/client.h> |
| |
| namespace DX { |
| inline void ThrowIfFailed(HRESULT hr) |
| { |
| if (FAILED(hr)) { |
| // Set a breakpoint on this line to catch Win32 API errors. |
| throw Platform::Exception::CreateException(hr); |
| } |
| } |
| |
| // Function that reads from a binary file asynchronously. |
| inline Concurrency::task<Platform::Array<byte> ^> ReadDataAsync( |
| Platform::String ^ filename) |
| { |
| using namespace Windows::Storage; |
| using namespace Concurrency; |
| |
| auto folder = Windows::ApplicationModel::Package::Current->InstalledLocation; |
| |
| return create_task(folder->GetFileAsync(filename)) |
| .then([](StorageFile ^ file) { |
| #if !PHONE |
| return FileIO::ReadBufferAsync(file); |
| #else |
| return file->OpenReadAsync(); |
| }).then([](Streams::IRandomAccessStreamWithContentType^ stream) |
| { |
| unsigned int bufferSize = static_cast<unsigned int>(stream->Size); |
| auto fileBuffer = ref new Streams::Buffer(bufferSize); |
| return stream->ReadAsync(fileBuffer, bufferSize, Streams::InputStreamOptions::None); |
| #endif |
| }) |
| .then([](Streams::IBuffer ^ fileBuffer) -> Platform::Array<byte> ^ { |
| auto fileData = ref new Platform::Array<byte>(fileBuffer->Length); |
| Streams::DataReader::FromBuffer(fileBuffer)->ReadBytes(fileData); |
| return fileData; |
| }); |
| } |
| } |