mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-02-18 01:00:06 +01:00
## Summary of the Pull Request There are many build warnings now with like "cl : command line warning D9047: option 'await' has been deprecated and will be re moved in a future release." after we update to VS2026. Introduce WinRT coroutine support by replacing `std::future` with `IAsyncOperation` for asynchronous methods. Adjust output directories and remove the `/await` option from project files to streamline the build process. Update methods to utilize `std::expected` and `co_await`, enhancing the async handling of version checks and downloads. ## PR Checklist - [ ] Closes: #xxx - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx ## Detailed Description of the Pull Request / Additional comments Refactor async methods to improve performance and compatibility with WinRT. The changes include modifying the return types of several functions in the `updating` namespace, specifically `uninstall_previous_msix_version_async`, `get_github_version_info_async`, and `download_new_version_async`. ## Validation Steps Performed Manual testing was conducted to ensure that the new async methods function correctly and that the application behaves as expected during version checks and downloads. Automated tests were updated to cover the new coroutine implementations. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
81 lines
3.3 KiB
C++
81 lines
3.3 KiB
C++
#pragma once
|
|
|
|
#include <functional>
|
|
#include <string>
|
|
#include <winrt/Windows.Foundation.h>
|
|
#include <winrt/Windows.Storage.Streams.h>
|
|
#include <winrt/Windows.Web.Http.h>
|
|
#include <winrt/Windows.Web.Http.Headers.h>
|
|
namespace http
|
|
{
|
|
using namespace winrt::Windows::Web::Http;
|
|
namespace storage = winrt::Windows::Storage;
|
|
|
|
const inline wchar_t USER_AGENT[] = L"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
|
|
|
|
class HttpClient
|
|
{
|
|
public:
|
|
HttpClient()
|
|
{
|
|
auto headers = m_client.DefaultRequestHeaders();
|
|
headers.UserAgent().TryParseAdd(USER_AGENT);
|
|
}
|
|
|
|
winrt::Windows::Foundation::IAsyncOperation<winrt::hstring> request(winrt::Windows::Foundation::Uri url)
|
|
{
|
|
auto response = co_await m_client.GetAsync(url);
|
|
(void)response.EnsureSuccessStatusCode();
|
|
auto body = co_await response.Content().ReadAsStringAsync();
|
|
co_return body;
|
|
}
|
|
|
|
winrt::Windows::Foundation::IAsyncAction download(winrt::Windows::Foundation::Uri url, std::wstring dstFilePath)
|
|
{
|
|
auto response = co_await m_client.GetAsync(url);
|
|
(void)response.EnsureSuccessStatusCode();
|
|
auto file_stream = co_await storage::Streams::FileRandomAccessStream::OpenAsync(dstFilePath.c_str(), storage::FileAccessMode::ReadWrite, storage::StorageOpenOptions::AllowReadersAndWriters, storage::Streams::FileOpenDisposition::CreateAlways);
|
|
co_await response.Content().WriteToStreamAsync(file_stream);
|
|
file_stream.Close();
|
|
}
|
|
|
|
winrt::Windows::Foundation::IAsyncAction download(winrt::Windows::Foundation::Uri url, std::wstring dstFilePath, std::function<void(float)> progressUpdateCallback)
|
|
{
|
|
auto response = co_await m_client.GetAsync(url, HttpCompletionOption::ResponseHeadersRead);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
uint64_t totalBytes = response.Content().Headers().ContentLength().GetUInt64();
|
|
auto contentStream = co_await response.Content().ReadAsInputStreamAsync();
|
|
|
|
uint64_t totalBytesRead = 0;
|
|
storage::Streams::Buffer buffer(8192);
|
|
auto fileStream = co_await storage::Streams::FileRandomAccessStream::OpenAsync(dstFilePath.c_str(), storage::FileAccessMode::ReadWrite, storage::StorageOpenOptions::AllowReadersAndWriters, storage::Streams::FileOpenDisposition::CreateAlways);
|
|
|
|
co_await contentStream.ReadAsync(buffer, buffer.Capacity(), storage::Streams::InputStreamOptions::None);
|
|
while (buffer.Length() > 0)
|
|
{
|
|
co_await fileStream.WriteAsync(buffer);
|
|
totalBytesRead += buffer.Length();
|
|
if (progressUpdateCallback)
|
|
{
|
|
float percentage = static_cast<float>(totalBytesRead) / totalBytes;
|
|
progressUpdateCallback(percentage);
|
|
}
|
|
|
|
co_await contentStream.ReadAsync(buffer, buffer.Capacity(), storage::Streams::InputStreamOptions::None);
|
|
}
|
|
|
|
if (progressUpdateCallback)
|
|
{
|
|
progressUpdateCallback(1);
|
|
}
|
|
|
|
fileStream.Close();
|
|
contentStream.Close();
|
|
}
|
|
|
|
private:
|
|
winrt::Windows::Web::Http::HttpClient m_client;
|
|
};
|
|
}
|