From b26e6382656b38b1b4f17956ceaef6d6cee1ccaa Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Fri, 8 Sep 2023 20:29:53 -0700 Subject: [PATCH 01/22] Added AddPackageSetOptions. Added tests for AddPackageSetAsync. Fixed bugs --- .../API/M.W.M.D.AddPackageSetOptions.cpp | 35 ++ .../API/M.W.M.D.AddPackageSetOptions.h | 32 ++ .../API/M.W.M.D.PackageDeploymentManager.cpp | 179 +++++++-- .../API/M.W.M.D.PackageDeploymentManager.h | 7 +- dev/PackageManager/API/PackageManager.idl | 57 +-- .../API/PackageManager.vcxitems | 2 + .../API/PackageManager.vcxitems.filters | 6 + .../appxmanifest.xml | 4 +- .../API/PackageDeploymentManagerTests.cpp | 349 ++++++++++++++++++ .../API/PackageManagerTests.Packages.h | 22 ++ 10 files changed, 646 insertions(+), 47 deletions(-) create mode 100644 dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.cpp create mode 100644 dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.h diff --git a/dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.cpp b/dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.cpp new file mode 100644 index 0000000000..6b6927aa37 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.cpp @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include "M.W.M.D.AddPackageSetOptions.h" +#include "Microsoft.Windows.Management.Deployment.AddPackageSetOptions.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel AddPackageSetOptions::DeploymentProcessingModel() + { + return m_deploymentProcessingModel; + } + void AddPackageSetOptions::DeploymentProcessingModel(winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel const& value) + { + m_deploymentProcessingModel = value; + } + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority AddPackageSetOptions::DeploymentPriority() + { + return m_deploymentPriority; + } + void AddPackageSetOptions::DeploymentPriority(winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority const& value) + { + m_deploymentPriority = value; + } + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions AddPackageSetOptions::AddPackageOptions() + { + return m_addPackageOptions; + } + void AddPackageSetOptions::AddPackageOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions const& value) + { + m_addPackageOptions = value; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.h b/dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.h new file mode 100644 index 0000000000..86b8fea9b8 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.AddPackageSetOptions.h @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.AddPackageSetOptions.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct AddPackageSetOptions : AddPackageSetOptionsT + { + AddPackageSetOptions() = default; + + winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel DeploymentProcessingModel(); + void DeploymentProcessingModel(winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel const& value); + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority DeploymentPriority(); + void DeploymentPriority(winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority const& value); + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions AddPackageOptions(); + void AddPackageOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions const& value); + + private: + winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel m_deploymentProcessingModel{}; + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority m_deploymentPriority{ winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority::Normal }; + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions m_addPackageOptions{}; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct AddPackageSetOptions : AddPackageSetOptionsT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp index 74fbb9cc76..1f9567d367 100644 --- a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp @@ -167,7 +167,7 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation // Check parameter(s) //TODO Validate(packageSet); - winrt::Windows::Management::Deployment::AddPackageOptions addOptions/*TODO { ToOptions(options) }*/; + winrt::Windows::Management::Deployment::AddPackageOptions addOptions{ ToOptions(options) }; try { auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; @@ -204,12 +204,61 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation //TODO logTelemetry.Stop(); } winrt::Windows::Foundation::IAsyncOperationWithProgress - PackageDeploymentManager::AddPackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options) + PackageDeploymentManager::AddPackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options) { - throw hresult_not_implemented(); + //TODO auto logTelemetry{ PackageDeploymentTelemetry::CreateChannelAsync::Start(g_telemetryHelper, remoteId) }; + + auto strong = get_strong(); //TODO why? + + auto cancellation{ co_await winrt::get_cancellation_token() }; + cancellation.enable_propagation(true); + + //TODO logTelemetry.IgnoreCurrentThread(); + + // Allow to register the progress and complete handler + co_await resume_background(); + + //TODO auto logTelemetryContinuation = logTelemetry.ContinueOnCurrentThread(); + + auto progress{ co_await winrt::get_progress_token() }; + auto packageDeploymentProgress{ + winrt::make< + winrt::Microsoft::Windows::Management::Deployment::implementation::PackageDeploymentProgress>( + PackageDeploymentProgressStatus::Queued, 0) }; + progress(packageDeploymentProgress); + + // Check parameter(s) + Validate(packageSet); + + packageDeploymentProgress.status(PackageDeploymentProgressStatus::InProgress); + const double c_progressPercentageStartOfInstalls{ 0.10 }; + packageDeploymentProgress.percentage(c_progressPercentageStartOfInstalls); + progress(packageDeploymentProgress); + auto packageSetItems{ packageSet.PackageSetItems() }; + const double progressIncrementPerPackageSetItem{ (1.0 - c_progressPercentageStartOfInstalls) / packageSetItems.Size() }; + for (const winrt::Microsoft::Windows::Management::Deployment::PackageSetItem& packageSetItem : packageSetItems) + { + try + { + AddAsync(packageSetItem, options); + packageDeploymentProgress.percentage(packageDeploymentProgress.percentage() + progressIncrementPerPackageSetItem); + progress(packageDeploymentProgress); + } + catch (...) + { + auto exception{ hresult_error(to_hresult(), take_ownership_from_abi) }; + co_return winrt::make( + PackageDeploymentStatus::CompletedFailure, exception.code(), false, /*TODO*/winrt::guid{}); + } + } + + co_return winrt::make( + PackageDeploymentStatus::CompletedSuccess, S_OK, true, /*TODO*/winrt::guid{}); + + //TODO logTelemetry.Stop(); } winrt::Windows::Foundation::IAsyncOperationWithProgress - PackageDeploymentManager::AddPackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options) + PackageDeploymentManager::AddPackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options) { throw hresult_not_implemented(); } @@ -269,7 +318,37 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation } auto packageUri{ packageSetItem.PackageUri() }; - winrt::Windows::Management::Deployment::AddPackageOptions addOptions/*TODO { ToOptions(options) }*/; + winrt::Windows::Management::Deployment::AddPackageOptions addOptions{ ToOptions(options) }; + auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; + deploymentOperation.get(); + try + { + const auto deploymentResult{ deploymentOperation.GetResults() }; + if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Error) + { + const winrt::hresult hr{ static_cast(deploymentOperation.ErrorCode()) }; + THROW_IF_FAILED_MSG(hr, "%ls", packageUri.ToString().c_str()); + const winrt::hresult extendedHr{ deploymentResult.ExtendedErrorCode() }; + THROW_IF_FAILED_MSG(extendedHr, "%ls", packageUri.ToString().c_str()); + FAIL_FAST_HR_MSG(E_UNEXPECTED, "%ls", packageUri.ToString().c_str()); + } + else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Canceled) + { + THROW_WIN32_MSG(ERROR_CANCELLED, "%ls", packageUri.ToString().c_str()); + } + FAIL_FAST_HR_IF_MSG(E_UNEXPECTED, deploymentOperation.Status() != winrt::Windows::Foundation::AsyncStatus::Completed, "%ls", packageUri.ToString().c_str()); + } + catch (...) + { + auto exception{ hresult_error(to_hresult(), take_ownership_from_abi) }; + THROW_HR_MSG(exception.code(), "%ls", packageUri.ToString().c_str()); + } + } + + void PackageDeploymentManager::AddAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions const& options) + { + auto packageUri{ packageSetItem.PackageUri() }; + winrt::Windows::Management::Deployment::AddPackageOptions addOptions{ ToOptions(options) }; auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; deploymentOperation.get(); try @@ -278,6 +357,12 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Error) { const winrt::hresult hr{ static_cast(deploymentOperation.ErrorCode()) }; + if (hr == HRESULT_FROM_WIN32(ERROR_INSTALL_PACKAGE_DOWNGRADE)) + { + // Newer version already installed. Success! + (void)LOG_HR_MSG(HRESULT_FROM_WIN32(ERROR_INSTALL_PACKAGE_DOWNGRADE), "%ls", deploymentResult.ErrorText().c_str()); + return; + } THROW_IF_FAILED_MSG(hr, "%ls", packageUri.ToString().c_str()); const winrt::hresult extendedHr{ deploymentResult.ExtendedErrorCode() }; THROW_IF_FAILED_MSG(extendedHr, "%ls", packageUri.ToString().c_str()); @@ -298,16 +383,34 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation winrt::Windows::Management::Deployment::PackageVolume PackageDeploymentManager::ToPackageVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& packageVolume) const { - auto toPackageVolume{ m_packageManager.FindPackageVolume(packageVolume.Name()) }; - return toPackageVolume; + if (packageVolume) + { + const auto name{ packageVolume.Name() }; + if (!name.empty()) + { + auto toPackageVolume{ m_packageManager.FindPackageVolume(name) }; + return toPackageVolume; + } + } + return nullptr; } winrt::Windows::Management::Deployment::AddPackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions const& options) const { + if (!options) + { + return winrt::Windows::Management::Deployment::AddPackageOptions(); + } + winrt::Windows::Management::Deployment::AddPackageOptions toOptions; - if (options.TargetVolume()) + const auto targetVolume{ options.TargetVolume() }; + if (targetVolume) { - toOptions.TargetVolume(ToPackageVolume(options.TargetVolume())); + const auto toPackageVolume{ ToPackageVolume(targetVolume) }; + if (toPackageVolume) + { + toOptions.TargetVolume(toPackageVolume); + } } for (const auto uri : options.DependencyPackageUris()) { @@ -339,10 +442,14 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation toOptions.DeferRegistrationWhenPackagesAreInUse(options.DeferRegistrationWhenPackagesAreInUse()); if (options.IsExpectedDigestsSupported()) { - auto toExpectedDigests = toOptions.ExpectedDigests(); - for (const auto expectedDigest : options.ExpectedDigests()) + const auto expectedDigests{ options.ExpectedDigests() }; + if (expectedDigests) { - toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + auto toExpectedDigests{ toOptions.ExpectedDigests() }; + for (const auto expectedDigest : expectedDigests) + { + toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + } } } if (options.IsLimitToExistingPackagesSupported()) @@ -352,12 +459,22 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation return toOptions; } + winrt::Windows::Management::Deployment::AddPackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions const& options) const + { + return ToOptions(options.AddPackageOptions()); + } + winrt::Windows::Management::Deployment::StagePackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::StagePackageOptions const& options) const { winrt::Windows::Management::Deployment::StagePackageOptions toOptions; - if (options.TargetVolume()) + const auto targetVolume{ options.TargetVolume() }; + if (targetVolume) { - toOptions.TargetVolume(ToPackageVolume(options.TargetVolume())); + const auto toPackageVolume{ ToPackageVolume(targetVolume) }; + if (toPackageVolume) + { + toOptions.TargetVolume(toPackageVolume); + } } for (const auto uri : options.DependencyPackageUris()) { @@ -385,10 +502,14 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation toOptions.AllowUnsigned(options.AllowUnsigned()); if (options.IsExpectedDigestsSupported()) { - auto toExpectedDigests = toOptions.ExpectedDigests(); - for (const auto expectedDigest : options.ExpectedDigests()) + const auto expectedDigests{ options.ExpectedDigests() }; + if (expectedDigests) { - toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + auto toExpectedDigests{ toOptions.ExpectedDigests() }; + for (const auto expectedDigest : expectedDigests) + { + toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + } } } return toOptions; @@ -397,9 +518,14 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation winrt::Windows::Management::Deployment::RegisterPackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::RegisterPackageOptions const& options) const { winrt::Windows::Management::Deployment::RegisterPackageOptions toOptions; - if (options.AppDataVolume()) + const auto appDataVolume{ options.AppDataVolume() }; + if (appDataVolume) { - toOptions.AppDataVolume(ToPackageVolume(options.AppDataVolume())); + const auto toPackageVolume{ ToPackageVolume(appDataVolume) }; + if (toPackageVolume) + { + toOptions.AppDataVolume(toPackageVolume); + } } for (const auto uri : options.DependencyPackageUris()) { @@ -420,10 +546,14 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation toOptions.DeferRegistrationWhenPackagesAreInUse(options.DeferRegistrationWhenPackagesAreInUse()); if (options.IsExpectedDigestsSupported()) { - auto toExpectedDigests = toOptions.ExpectedDigests(); - for (const auto expectedDigest : options.ExpectedDigests()) + const auto expectedDigests{ options.ExpectedDigests() }; + if (expectedDigests) { - toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + auto toExpectedDigests{ toOptions.ExpectedDigests() }; + for (const auto expectedDigest : expectedDigests) + { + toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + } } } return toOptions; @@ -447,4 +577,9 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation //TODO DeploymentPriority Priority; return toOptions; } + + winrt::Windows::Management::Deployment::AddPackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions const& /*options*/) const + { + return winrt::Windows::Management::Deployment::AddPackageOptions(); + } } diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h index 5c1f7e4834..4556f4d7d8 100644 --- a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h @@ -18,8 +18,8 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation winrt::Windows::Foundation::IAsyncOperationWithProgress EnsurePackageSetIsReadyByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageAsync(hstring package, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageByUriAsync(winrt::Windows::Foundation::Uri packageUri, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); - winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); - winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFullNameNameAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFamilyNameNameAsync(hstring packageFamilyName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); @@ -30,11 +30,14 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation void Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) const; void Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem) const; void EnsureIsReadyAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions const& options); + void AddAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions const& options); winrt::Windows::Management::Deployment::PackageVolume ToPackageVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& packageVolume) const; winrt::Windows::Management::Deployment::AddPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions const& options) const; + winrt::Windows::Management::Deployment::AddPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions const& options) const; winrt::Windows::Management::Deployment::StagePackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::StagePackageOptions const& options) const; winrt::Windows::Management::Deployment::RegisterPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::RegisterPackageOptions const& options) const; winrt::Windows::Management::Deployment::RemovalOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions const& options) const; + winrt::Windows::Management::Deployment::AddPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions const& options) const; private: winrt::Windows::Management::Deployment::PackageManager m_packageManager; diff --git a/dev/PackageManager/API/PackageManager.idl b/dev/PackageManager/API/PackageManager.idl index f21ace0524..98ceab8158 100644 --- a/dev/PackageManager/API/PackageManager.idl +++ b/dev/PackageManager/API/PackageManager.idl @@ -27,6 +27,7 @@ namespace Microsoft.Windows.Management.Deployment [contract(PackageDeploymentContract, 1)] enum DeploymentPriority { + // Default? Caller? Low, Normal, Immediate @@ -195,26 +196,6 @@ namespace Microsoft.Windows.Management.Deployment Guid ActivityId { get; }; } - [feature(Feature_PackageManager)] - [contract(PackageDeploymentContract, 1)] - runtimeclass EnsureIsReadyOptions - { - EnsureIsReadyOptions(); - - // Options influencing deployment if/when needed - DeploymentProcessingModel DeploymentProcessingModel; - DeploymentPriority DeploymentPriority; - - // ??? Additional info potentially needed for deployment operations - //TODO see AddPackageOptions - //TODO see RegisterPackageOptions - //TODO see StagePackageOptions - - // Additional info for runtime use - //TODO see CreatePackageDependencyOptions - //TODO see AddPackageDependencyOptions - } - [feature(Feature_PackageManager)] [contract(PackageDeploymentContract, 1)] enum StubPackageOption @@ -257,6 +238,18 @@ namespace Microsoft.Windows.Management.Deployment Boolean LimitToExistingPackages; } + // Requires Windows >- 10.0.19041.0 (aka 2004 aka 20H1) + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass AddPackageSetOptions + { + AddPackageSetOptions(); + + DeploymentProcessingModel DeploymentProcessingModel; + DeploymentPriority DeploymentPriority; + AddPackageOptions AddPackageOptions; + } + // Requires Windows >- 10.0.19041.0 (aka 2004 aka 20H1) [feature(Feature_PackageManager)] [contract(PackageDeploymentContract, 1)] @@ -319,6 +312,26 @@ namespace Microsoft.Windows.Management.Deployment DeploymentPriority Priority; } + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass EnsureIsReadyOptions + { + EnsureIsReadyOptions(); + + // Options influencing deployment if/when needed + DeploymentProcessingModel DeploymentProcessingModel; + DeploymentPriority DeploymentPriority; + + // ??? Additional info potentially needed for deployment operations + //TODO see AddPackageOptions + //TODO see RegisterPackageOptions + //TODO see StagePackageOptions + + // Additional info for runtime use + //TODO see CreatePackageDependencyOptions + //TODO see AddPackageDependencyOptions + } + // The API surface is strongly consistent: // 1. Modification operations involving incoming packages... // - PackageAsync (string, options) @@ -368,10 +381,10 @@ namespace Microsoft.Windows.Management.Deployment AddPackageByUriAsync(Windows.Foundation.Uri packageUri, AddPackageOptions options); Windows.Foundation.IAsyncOperationWithProgress - AddPackageSetAsync(PackageSet packageSet, AddPackageOptions options); + AddPackageSetAsync(PackageSet packageSet, AddPackageSetOptions options); Windows.Foundation.IAsyncOperationWithProgress - AddPackageSetByIdAsync(String packageSetId, AddPackageOptions options); + AddPackageSetByIdAsync(String packageSetId, AddPackageSetOptions options); // Remove packages Windows.Foundation.IAsyncOperationWithProgress diff --git a/dev/PackageManager/API/PackageManager.vcxitems b/dev/PackageManager/API/PackageManager.vcxitems index 82997a5f76..f2fd326cd5 100644 --- a/dev/PackageManager/API/PackageManager.vcxitems +++ b/dev/PackageManager/API/PackageManager.vcxitems @@ -15,6 +15,7 @@ + @@ -36,6 +37,7 @@ + diff --git a/dev/PackageManager/API/PackageManager.vcxitems.filters b/dev/PackageManager/API/PackageManager.vcxitems.filters index a0dac11ac4..ebcd8cd73d 100644 --- a/dev/PackageManager/API/PackageManager.vcxitems.filters +++ b/dev/PackageManager/API/PackageManager.vcxitems.filters @@ -14,6 +14,9 @@ Source Files + + Source Files + Source Files @@ -73,6 +76,9 @@ Header Files + + Header Files + Header Files diff --git a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml index 4fa4b656b1..f0dd3f24ca 100644 --- a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml +++ b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml @@ -81,6 +81,7 @@ Microsoft.WindowsAppRuntime.dll + @@ -89,9 +90,10 @@ + + - diff --git a/test/PackageManager/API/PackageDeploymentManagerTests.cpp b/test/PackageManager/API/PackageDeploymentManagerTests.cpp index 6e6f69607c..a779a8b592 100644 --- a/test/PackageManager/API/PackageDeploymentManagerTests.cpp +++ b/test/PackageManager/API/PackageDeploymentManagerTests.cpp @@ -842,6 +842,355 @@ namespace Test::PackageManager::Tests //TODO REMOVE ClearPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); } + TEST_METHOD(AddPackageSetAsync_1_NoSuchPackage_Fail) + { + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; + winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(c_packageUri); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedFailure, deploymentResult.Status()); + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_INSTALL_OPEN_PACKAGE_FAILED), deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_1_NotInstalled_Success) + { + RemovePackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_1_Staged_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + StagePackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_1_Registered_Success) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_1_OlderRegistered_Success) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageSetAsync_1_NewerRegistered_Success) + { + AddPackage_Redder(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageSetAsync_1_RegisteredPackageStatusBad_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + SetPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + //TODO REMOVE ClearPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + + TEST_METHOD(AddPackageSetAsync_N_NotInstalled_Success) + { + RemovePackage_Red(); + RemovePackage_Green(); + RemovePackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_N_Registered_Success) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_N_NewerRegistered_Success) + { + AddPackage_Redder(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageSetAsync_N_OlderRegistered_Success) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageSetAsync_N_RegisteredAndNotInstalled_Success) + { + AddPackage_Red(); + RemovePackage_Green(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_N_RegisteredAndNotInstalledAndStaged_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + RemovePackage_Green(); + StagePackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(AddPackageSetAsync_N_RegisteredPackageStatusOkAndBad_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + AddPackage_Green(); + SetPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + + winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageSetAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + //TODO REMOVE ClearPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + private: winrt::Windows::Management::Deployment::PackageManager m_packageManager; }; diff --git a/test/PackageManager/API/PackageManagerTests.Packages.h b/test/PackageManager/API/PackageManagerTests.Packages.h index 4a8404a665..f81078c13e 100644 --- a/test/PackageManager/API/PackageManagerTests.Packages.h +++ b/test/PackageManager/API/PackageManagerTests.Packages.h @@ -127,6 +127,10 @@ namespace Test::PackageManager::Tests // Thus, do a *IfNecessary removal TP::RemovePackageIfNecessary(TPF::Red::GetPackageFullName()); } + inline bool IsPackageRegistered_Red() + { + return TP::IsPackageRegistered(TPF::Blue::GetPackageFullName()); + } inline void AddPackage_Redder() { @@ -146,6 +150,10 @@ namespace Test::PackageManager::Tests // Thus, do a *IfNecessary removal TP::RemovePackageIfNecessary(TPF::Redder::GetPackageFullName()); } + inline bool IsPackageRegistered_Redder() + { + return TP::IsPackageRegistered(TPF::Blue::GetPackageFullName()); + } inline void AddPackage_Green() { @@ -165,6 +173,10 @@ namespace Test::PackageManager::Tests // Thus, do a *IfNecessary removal TP::RemovePackageIfNecessary(TPF::Green::GetPackageFullName()); } + inline bool IsPackageRegistered_Green() + { + return TP::IsPackageRegistered(TPF::Blue::GetPackageFullName()); + } inline void AddPackage_Blue() { @@ -184,6 +196,16 @@ namespace Test::PackageManager::Tests // Thus, do a *IfNecessary removal TP::RemovePackageIfNecessary(TPF::Blue::GetPackageFullName()); } + inline bool IsPackageRegistered_Blue() + { + return TP::IsPackageRegistered(TPF::Blue::GetPackageFullName()); + } + + inline winrt::Windows::ApplicationModel::PackageStatus GetPackageStatus(winrt::Windows::Management::Deployment::PackageManager packageManager, PCWSTR packageFullName) + { + auto package{ packageManager.FindPackageForUser(winrt::hstring(), packageFullName) }; + return package.Status(); + } inline void SetPackageStatus(winrt::Windows::Management::Deployment::PackageManager packageManager, PCWSTR packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus status) { From 7c74563cacd3b612d72c8265d04d2500a5a5379f Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Fri, 8 Sep 2023 22:18:07 -0700 Subject: [PATCH 02/22] Fixed typos. Added missing AddPackageAsync in .idl --- .../API/M.W.M.D.PackageDeploymentManager.cpp | 38 ++++- .../API/M.W.M.D.PackageDeploymentManager.h | 6 +- dev/PackageManager/API/PackageManager.idl | 19 ++- .../API/PackageDeploymentManagerTests.cpp | 144 ++++++++++++++++-- .../API/PackageManagerTests.Packages.h | 6 +- 5 files changed, 194 insertions(+), 19 deletions(-) diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp index 1f9567d367..fc174daf3a 100644 --- a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp @@ -168,6 +168,21 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation //TODO Validate(packageSet); winrt::Windows::Management::Deployment::AddPackageOptions addOptions{ ToOptions(options) }; +#if 1 + try + { + AddAsync(packageUri, addOptions); + } + catch (...) + { + auto exception{ hresult_error(to_hresult(), take_ownership_from_abi) }; + co_return winrt::make( + PackageDeploymentStatus::CompletedFailure, exception.code(), false, /*TODO*/winrt::guid{}); + } + + co_return winrt::make( + PackageDeploymentStatus::CompletedSuccess, S_OK, true, /*TODO*/winrt::guid{}); +#else try { auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; @@ -200,6 +215,7 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation co_return winrt::make( PackageDeploymentStatus::CompletedFailure, exception.code(), false, /*TODO*/winrt::guid{}); } +#endif //TODO logTelemetry.Stop(); } @@ -263,12 +279,25 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation throw hresult_not_implemented(); } winrt::Windows::Foundation::IAsyncOperationWithProgress - PackageDeploymentManager::RemovePackageByFullNameNameAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) + PackageDeploymentManager::RemovePackageAsync(hstring package, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) + { + if (VerifyPackageFamilyName(package.c_str()) == ERROR_SUCCESS) + { + return RemovePackageByFamilyNameAsync(package, options); + } + else if (VerifyPackageFullName(package.c_str()) == ERROR_SUCCESS) + { + return RemovePackageByFullNameAsync(package, options); + } + THROW_HR_MSG(E_INVALIDARG, "%ls", package.c_str()); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::RemovePackageByFullNameAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) { throw hresult_not_implemented(); } winrt::Windows::Foundation::IAsyncOperationWithProgress - PackageDeploymentManager::RemovePackageByFamilyNameNameAsync(hstring packageFamilyName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) + PackageDeploymentManager::RemovePackageByFamilyNameAsync(hstring packageFamilyName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) { throw hresult_not_implemented(); } @@ -349,6 +378,11 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation { auto packageUri{ packageSetItem.PackageUri() }; winrt::Windows::Management::Deployment::AddPackageOptions addOptions{ ToOptions(options) }; + AddAsync(packageUri, addOptions); + } + + void PackageDeploymentManager::AddAsync(winrt::Windows::Foundation::Uri const& packageUri, winrt::Windows::Management::Deployment::AddPackageOptions const& addOptions) + { auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; deploymentOperation.get(); try diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h index 4556f4d7d8..be9c8ed393 100644 --- a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h @@ -20,8 +20,9 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageByUriAsync(winrt::Windows::Foundation::Uri packageUri, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options); - winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFullNameNameAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); - winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFamilyNameNameAsync(hstring packageFamilyName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFullNameAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFamilyNameAsync(hstring packageFamilyName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); @@ -31,6 +32,7 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation void Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem) const; void EnsureIsReadyAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions const& options); void AddAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions const& options); + void AddAsync(winrt::Windows::Foundation::Uri const& packageUri, winrt::Windows::Management::Deployment::AddPackageOptions const& addOptions); winrt::Windows::Management::Deployment::PackageVolume ToPackageVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& packageVolume) const; winrt::Windows::Management::Deployment::AddPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions const& options) const; winrt::Windows::Management::Deployment::AddPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions const& options) const; diff --git a/dev/PackageManager/API/PackageManager.idl b/dev/PackageManager/API/PackageManager.idl index 98ceab8158..ca1db7c62b 100644 --- a/dev/PackageManager/API/PackageManager.idl +++ b/dev/PackageManager/API/PackageManager.idl @@ -340,12 +340,21 @@ namespace Microsoft.Windows.Management.Deployment // - PackageSetByIdAsync(id, options) // where // = Add | Register | Stage + // Parameter string for... + // Add = path | uri + // Register = path | uri | packagefullname | packagefamilyname + // Stage = path | uri // 2. Modification operations involving existing packages... // - PackageAsync (string, options) // - PackageByPackageFamilyNameAsync(string, options) // - PackageByPackageFullNameAsync (string, options) // where // = Deprovision | Provision | Register | Remove + // Parameter string for... + // Deprovision = packagefamilyname + // Provision = packagefamilyname + // Register = packagefamilyname | packagefullname | path\appxmanifest.xml | path containing appxmanifest.xml | file://path/appxmanifest.xml | file://path containing appxmanifest.xml + // Remove = packagefamilyname | packagefullname // // TODO: AppInstaller // TODO: Move @@ -377,6 +386,9 @@ namespace Microsoft.Windows.Management.Deployment EnsurePackageSetIsReadyByIdAsync(String packageSetId, EnsureIsReadyOptions options); // Add packages + Windows.Foundation.IAsyncOperationWithProgress + AddPackageAsync(String package, AddPackageOptions options); + Windows.Foundation.IAsyncOperationWithProgress AddPackageByUriAsync(Windows.Foundation.Uri packageUri, AddPackageOptions options); @@ -388,10 +400,13 @@ namespace Microsoft.Windows.Management.Deployment // Remove packages Windows.Foundation.IAsyncOperationWithProgress - RemovePackageByFullNameNameAsync(String packageFullName, RemovePackageOptions options); + RemovePackageAsync(String package, RemovePackageOptions options); + + Windows.Foundation.IAsyncOperationWithProgress + RemovePackageByFullNameAsync(String packageFullName, RemovePackageOptions options); Windows.Foundation.IAsyncOperationWithProgress - RemovePackageByFamilyNameNameAsync(String packageFamilyName, RemovePackageOptions options); + RemovePackageByFamilyNameAsync(String packageFamilyName, RemovePackageOptions options); Windows.Foundation.IAsyncOperationWithProgress RemovePackageSetAsync(PackageSet packageSet, RemovePackageOptions options); diff --git a/test/PackageManager/API/PackageDeploymentManagerTests.cpp b/test/PackageManager/API/PackageDeploymentManagerTests.cpp index a779a8b592..7b4c429665 100644 --- a/test/PackageManager/API/PackageDeploymentManagerTests.cpp +++ b/test/PackageManager/API/PackageDeploymentManagerTests.cpp @@ -142,8 +142,8 @@ namespace Test::PackageManager::Tests packageSet.Id(c_packageSetId); winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; PCWSTR c_packageUriAsString{ L"https://doesnotexist.com/assemble.msix" }; - winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; - packageSetItem.PackageUri(c_packageUri); + winrt::Windows::Foundation::Uri packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(packageUri); packageSet.PackageSetItems().Append(packageSetItem); packageDeploymentManager.IsPackageSetReady(packageSet); @@ -166,8 +166,8 @@ namespace Test::PackageManager::Tests PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; packageSetItem.PackageFamilyName(c_packageFamilyName); PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; - winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; - packageSetItem.PackageUri(c_packageUri); + winrt::Windows::Foundation::Uri packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(packageUri); packageSet.PackageSetItems().Append(packageSetItem); VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); @@ -479,8 +479,8 @@ namespace Test::PackageManager::Tests packageSet.Id(c_packageSetId); winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; PCWSTR c_packageUriAsString{ L"file://c:/assemble.msix" }; - winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; - packageSetItem.PackageUri(c_packageUri); + winrt::Windows::Foundation::Uri packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(packageUri); packageSet.PackageSetItems().Append(packageSetItem); winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; @@ -504,8 +504,8 @@ namespace Test::PackageManager::Tests PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; packageSetItem.PackageFamilyName(c_packageFamilyName); PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; - winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; - packageSetItem.PackageUri(c_packageUri); + winrt::Windows::Foundation::Uri packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(packageUri); packageSet.PackageSetItems().Append(packageSetItem); winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; @@ -842,6 +842,130 @@ namespace Test::PackageManager::Tests //TODO REMOVE ClearPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); } + TEST_METHOD(AddPackageByUriAsync_NoSuchPackage_Fail) + { + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; + winrt::Windows::Foundation::Uri packageUri{ c_packageUriAsString }; + + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageByUriAsync(packageUri, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedFailure, deploymentResult.Status()); + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_INSTALL_OPEN_PACKAGE_FAILED), deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + } + + TEST_METHOD(AddPackageByUriAsync_NotInstalled_Success) + { + RemovePackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Windows::Foundation::Uri packageUri{ TP::GetMsixPackageUri(::TPF::Red::c_packageDirName) }; + + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageByUriAsync(packageUri, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(IsPackageRegistered_Red()); + } + + TEST_METHOD(AddPackageByUriAsync_Staged_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + StagePackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Windows::Foundation::Uri packageUri{ TP::GetMsixPackageUri(::TPF::Red::c_packageDirName) }; + + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageByUriAsync(packageUri, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(IsPackageRegistered_Red()); + } + + TEST_METHOD(AddPackageByUriAsync_Registered_Success) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Windows::Foundation::Uri packageUri{ TP::GetMsixPackageUri(::TPF::Red::c_packageDirName) }; + + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageByUriAsync(packageUri, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(IsPackageRegistered_Red()); + } + + TEST_METHOD(AddPackageByUriAsync_OlderRegistered_Success) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Windows::Foundation::Uri packageUri{ TP::GetMsixPackageUri(::TPF::Red::c_packageDirName) }; + + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageByUriAsync(packageUri, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(IsPackageRegistered_Red()); + + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageByUriAsync_NewerRegistered_Success) + { + AddPackage_Redder(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Windows::Foundation::Uri packageUri{ TP::GetMsixPackageUri(::TPF::Red::c_packageDirName) }; + + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageByUriAsync(packageUri, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(IsPackageRegistered_Redder()); + + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageByUriAsync_RegisteredPackageStatusBad_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + SetPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Windows::Foundation::Uri packageUri{ TP::GetMsixPackageUri(::TPF::Red::c_packageDirName) }; + + winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options; + auto deploymentResult{ packageDeploymentManager.AddPackageByUriAsync(packageUri, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(IsPackageRegistered_Red()); + + //TODO REMOVE ClearPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + TEST_METHOD(AddPackageSetAsync_1_NoSuchPackage_Fail) { auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; @@ -853,8 +977,8 @@ namespace Test::PackageManager::Tests PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; packageSetItem.PackageFamilyName(c_packageFamilyName); PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; - winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; - packageSetItem.PackageUri(c_packageUri); + winrt::Windows::Foundation::Uri packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(packageUri); packageSet.PackageSetItems().Append(packageSetItem); winrt::Microsoft::Windows::Management::Deployment::AddPackageSetOptions options; diff --git a/test/PackageManager/API/PackageManagerTests.Packages.h b/test/PackageManager/API/PackageManagerTests.Packages.h index f81078c13e..2a8901c297 100644 --- a/test/PackageManager/API/PackageManagerTests.Packages.h +++ b/test/PackageManager/API/PackageManagerTests.Packages.h @@ -129,7 +129,7 @@ namespace Test::PackageManager::Tests } inline bool IsPackageRegistered_Red() { - return TP::IsPackageRegistered(TPF::Blue::GetPackageFullName()); + return TP::IsPackageRegistered(TPF::Red::GetPackageFullName()); } inline void AddPackage_Redder() @@ -152,7 +152,7 @@ namespace Test::PackageManager::Tests } inline bool IsPackageRegistered_Redder() { - return TP::IsPackageRegistered(TPF::Blue::GetPackageFullName()); + return TP::IsPackageRegistered(TPF::Redder::GetPackageFullName()); } inline void AddPackage_Green() @@ -175,7 +175,7 @@ namespace Test::PackageManager::Tests } inline bool IsPackageRegistered_Green() { - return TP::IsPackageRegistered(TPF::Blue::GetPackageFullName()); + return TP::IsPackageRegistered(TPF::Green::GetPackageFullName()); } inline void AddPackage_Blue() From 78f6af648457bfd27f79156100c20fd6cd4f501a Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Mon, 25 Sep 2023 15:51:35 -0700 Subject: [PATCH 03/22] Remove dead code --- .../API/M.W.M.D.PackageDeploymentManager.cpp | 41 ++----------------- 1 file changed, 3 insertions(+), 38 deletions(-) diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp index fc174daf3a..73c2088b8b 100644 --- a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp @@ -57,7 +57,7 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation { //TODO auto logTelemetry{ PackageDeploymentTelemetry::CreateChannelAsync::Start(g_telemetryHelper, remoteId) }; - auto strong = get_strong(); //TODO why? + auto strong = get_strong(); auto cancellation{ co_await winrt::get_cancellation_token() }; cancellation.enable_propagation(true); @@ -145,7 +145,7 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation { //TODO auto logTelemetry{ PackageDeploymentTelemetry::CreateChannelAsync::Start(g_telemetryHelper, remoteId) }; - auto strong = get_strong(); //TODO why? + auto strong = get_strong(); auto cancellation{ co_await winrt::get_cancellation_token() }; cancellation.enable_propagation(true); @@ -168,7 +168,6 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation //TODO Validate(packageSet); winrt::Windows::Management::Deployment::AddPackageOptions addOptions{ ToOptions(options) }; -#if 1 try { AddAsync(packageUri, addOptions); @@ -182,40 +181,6 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation co_return winrt::make( PackageDeploymentStatus::CompletedSuccess, S_OK, true, /*TODO*/winrt::guid{}); -#else - try - { - auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; - deploymentOperation.get(); - const auto deploymentResult{ deploymentOperation.GetResults() }; - if (deploymentOperation.Status() != winrt::Windows::Foundation::AsyncStatus::Completed) - { - co_return winrt::make( - PackageDeploymentStatus::CompletedSuccess, S_OK, deploymentResult.IsRegistered(), /*TODO*/winrt::guid{}); - } - else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Error) - { - const winrt::hresult hr{ static_cast(deploymentOperation.ErrorCode()) }; - const winrt::hresult extendedHr{ deploymentResult.ExtendedErrorCode() }; - FAIL_FAST_HR_IF_MSG(E_UNEXPECTED, SUCCEEDED(hr) && SUCCEEDED(extendedHr), "%ls", packageUri.ToString().c_str()); - const winrt::hresult resultHr{ FAILED(hr) ? hr : extendedHr }; - co_return winrt::make( - PackageDeploymentStatus::CompletedFailure, resultHr, deploymentResult.IsRegistered(), /*TODO*/winrt::guid{}); - } - else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Canceled) - { - THROW_WIN32_MSG(ERROR_CANCELLED, "%ls", packageUri.ToString().c_str()); - } - FAIL_FAST_HR_MSG(E_UNEXPECTED, "Status:%d Uri:%ls", static_cast(deploymentOperation.Status()), packageUri.ToString().c_str()); - } - catch (...) - { - auto exception{ hresult_error(to_hresult(), take_ownership_from_abi) }; - (void)LOG_HR_MSG(exception.code(), "%ls", packageUri.ToString().c_str()); - co_return winrt::make( - PackageDeploymentStatus::CompletedFailure, exception.code(), false, /*TODO*/winrt::guid{}); - } -#endif //TODO logTelemetry.Stop(); } @@ -224,7 +189,7 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation { //TODO auto logTelemetry{ PackageDeploymentTelemetry::CreateChannelAsync::Start(g_telemetryHelper, remoteId) }; - auto strong = get_strong(); //TODO why? + auto strong = get_strong(); auto cancellation{ co_await winrt::get_cancellation_token() }; cancellation.enable_propagation(true); From c1c7ccca26dbb2da1533f416ddb595772334b0ba Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Mon, 25 Sep 2023 15:52:03 -0700 Subject: [PATCH 04/22] Update Transport package's manifested inproc servers --- build/NuSpecs/AppxManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build/NuSpecs/AppxManifest.xml b/build/NuSpecs/AppxManifest.xml index bd305ecb71..a4c68722d5 100644 --- a/build/NuSpecs/AppxManifest.xml +++ b/build/NuSpecs/AppxManifest.xml @@ -64,6 +64,7 @@ + @@ -72,9 +73,10 @@ + + - From fbd5d592b9ed25fa596a387fb9968149bc5be001 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Thu, 19 Oct 2023 11:08:08 -0700 Subject: [PATCH 05/22] Added new directory --- dev/ApplicationData/ApplicationData.idl | 90 +++++++++++++++++++ dev/ApplicationData/ApplicationData.vcxitems | 27 ++++++ .../ApplicationData.vcxitems.filters | 32 +++++++ dev/ApplicationData/pch.h | 24 +++++ 4 files changed, 173 insertions(+) create mode 100644 dev/ApplicationData/ApplicationData.idl create mode 100644 dev/ApplicationData/ApplicationData.vcxitems create mode 100644 dev/ApplicationData/ApplicationData.vcxitems.filters create mode 100644 dev/ApplicationData/pch.h diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl new file mode 100644 index 0000000000..6e2894e997 --- /dev/null +++ b/dev/ApplicationData/ApplicationData.idl @@ -0,0 +1,90 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include + +namespace Microsoft.Windows.Storage +{ + [feature(Feature_ApplicationData)] + [contractversion(1)] + apicontract ApplicationDataContract{}; + + [feature(Feature_ApplicationData)] + [contract(ApplicationDataContract, 1)] + enum ApplicationDataLocality + { + // NOTE: Values 0-99 match Windows.Storage.ApplicationDataLocality. + // Values 1000+ are unique to us here. + Local = 0, + LocalCache = 3, + Roaming = 1, + SharedLocal = 4, + Temporary = 2, + Machine = 1000, + }; + + [feature(Feature_ApplicationData)] + [contract(ApplicationDataContract, 1)] + runtimeclass ApplicationDataContainer + { + ApplicationDataContainer(); + + Windows.Foundation.Map Containers { get; }; + String Name { get; }; + Values Windows.Foundation.PropertySet { get; }; + + void Close(); + void Dispose(); + + ApplicationDataContainer CreateContainer(String name, ApplicationDataCreateDisposition disposition); + void DeleteContainer(String name); + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass ApplicationData + { + /// Get an instance of ApplicationData + /// @note Requires the current process has package identity. + /// @note This is equivalent to Windows.Stoarge.ApplicationData.Current. + static ApplicationData GetDefault(); + + /// Get an instance of ApplicationData for the specified package family. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.CreateForPackageFamily() + static ApplicationData GetForPackageFamily(String packageFamilyName); + + /// Get an instance of ApplicationData for the specified user. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.GetForUserAsync() + Windows.Foundation.IAsyncOperation GetForUserAsync(Windows.System.User user); + + /// Get an instance of ApplicationData for the specified unpackaged app. + static ApplicationData GetForUnpackaged(String publisher, String name); + + String LocalCachePath { get; }; + String LocalPath { get; }; + String MachinePath { get; }; + String RoamingPath { get; }; + String SharedLocalPath { get; }; + String TemporaryPath { get; }; + + Windows.Storage.StorageFolder LocalCacheFolder { get; }; + Windows.Storage.StorageFolder LocalFolder { get; }; + Windows.Storage.StorageFolder MachineFolder { get; }; + Windows.Storage.StorageFolder RoamingFolder { get; }; + Windows.Storage.StorageFolder SharedLocalFolder { get; }; + Windows.Storage.StorageFolder TemporaryFolder { get; }; + + ApplicationDataContainer LocalSettings { get; }; + ApplicationDataContainer RoamingSettings { get; }; + + Windows.Foundation.IAsyncAction ClearAsync(); + Windows.Foundation.IAsyncAction ClearPublisherCacheFolderAsync(); + Windows.Foundation.IAsyncAction ClearMachineFolderAsync(); + + void Close(); + void Dispose(); + + Windows.Storage.StorageFolder GetPublisherCacheFolder(String folderName); + String GetPublisherCachePath(String folderName); + } +} diff --git a/dev/ApplicationData/ApplicationData.vcxitems b/dev/ApplicationData/ApplicationData.vcxitems new file mode 100644 index 0000000000..a38739b560 --- /dev/null +++ b/dev/ApplicationData/ApplicationData.vcxitems @@ -0,0 +1,27 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {7cf52890-56fa-47e2-84fb-68ee274324b6} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + + + + + diff --git a/dev/ApplicationData/ApplicationData.vcxitems.filters b/dev/ApplicationData/ApplicationData.vcxitems.filters new file mode 100644 index 0000000000..00da0cc045 --- /dev/null +++ b/dev/ApplicationData/ApplicationData.vcxitems.filters @@ -0,0 +1,32 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + + + + diff --git a/dev/ApplicationData/pch.h b/dev/ApplicationData/pch.h new file mode 100644 index 0000000000..44cdd5d542 --- /dev/null +++ b/dev/ApplicationData/pch.h @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include From 726d92fd25df1edd05a8f526d09adcbeb4242ae7 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sun, 24 Dec 2023 16:44:43 -0800 Subject: [PATCH 06/22] Added ApplicationData project. Expanded docs. Added missing ApplicationDataCreateDisposition. Added TerminalVelocity support --- WindowsAppRuntime.sln | 7 + dev/ApplicationData/ApplicationData.idl | 129 ++++++++++++++++-- ...TerminalVelocityFeatures-ApplicationData.h | 32 +++++ ...rminalVelocityFeatures-ApplicationData.xml | 20 +++ 4 files changed, 175 insertions(+), 13 deletions(-) create mode 100644 dev/Common/TerminalVelocityFeatures-ApplicationData.h create mode 100644 dev/Common/TerminalVelocityFeatures-ApplicationData.xml diff --git a/WindowsAppRuntime.sln b/WindowsAppRuntime.sln index c5187df602..a60acdddc3 100644 --- a/WindowsAppRuntime.sln +++ b/WindowsAppRuntime.sln @@ -705,6 +705,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workloads", "Workloads", "{ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Workloads", "dev\Workloads\Workloads.vcxitems", "{B5798CEB-4E60-4D2D-B456-7C406B5F5B67}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationData", "ApplicationData", "{E3023618-8435-444B-988E-3F898BD17724}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ApplicationData", "dev\ApplicationData\ApplicationData.vcxitems", "{7CF52890-56FA-47E2-84FB-68EE274324B6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -2590,6 +2594,8 @@ Global {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2} = {B6B68924-6A0B-457E-AD53-018696EC8889} {48948EF9-8B91-4F7A-98AD-0F8FA3EFAA38} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} {B5798CEB-4E60-4D2D-B456-7C406B5F5B67} = {48948EF9-8B91-4F7A-98AD-0F8FA3EFAA38} + {E3023618-8435-444B-988E-3F898BD17724} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} + {7CF52890-56FA-47E2-84FB-68EE274324B6} = {E3023618-8435-444B-988E-3F898BD17724} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4B3D7591-CFEC-4762-9A07-ABE99938FB77} @@ -2605,6 +2611,7 @@ Global test\inc\inc.vcxitems*{56a1d696-feda-4333-bf37-772ebececb10}*SharedItemsImports = 4 test\inc\inc.vcxitems*{5b2d17fe-c371-417f-860c-3d32397c2404}*SharedItemsImports = 4 test\inc\inc.vcxitems*{7c502995-59c3-483b-86ba-815985353633}*SharedItemsImports = 4 + dev\ApplicationData\ApplicationData.vcxitems*{7cf52890-56fa-47e2-84fb-68ee274324b6}*SharedItemsImports = 9 dev\Kozani\Common\Common.vcxitems*{829cdb09-eefe-4188-a045-3fc6be7bd96b}*SharedItemsImports = 4 dev\Common\Common.vcxitems*{8828053c-d6ec-4744-8624-f8c676c2d4df}*SharedItemsImports = 9 dev\Licensing\Licensing.vcxitems*{885a43fa-052d-4b0d-a2dc-13ee15796435}*SharedItemsImports = 9 diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index 6e2894e997..7e57d2996b 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -9,6 +9,8 @@ namespace Microsoft.Windows.Storage [contractversion(1)] apicontract ApplicationDataContract{}; + /// Specifies the type of data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatalocality [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] enum ApplicationDataLocality @@ -23,68 +25,169 @@ namespace Microsoft.Windows.Storage Machine = 1000, }; + /// Specifies options for creating application data containers or returning existing containers. [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] - runtimeclass ApplicationDataContainer + enum ApplicationDataCreateDisposition { - ApplicationDataContainer(); + /// Always returns the specified container. Creates the container if it does not exist. + Always = 0, + + // Returns the specified container only if it already exists. Raises an exception of type System.Exception if the specified container does not exist. + Existing, + } ApplicationDataCreateDisposition; + /// Represents a container for settings. The methods and properties of this class support creating, deleting, enumerating, and traversing the container hierarchy. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer + [feature(Feature_ApplicationData)] + [contract(ApplicationDataContract, 1)] + runtimeclass ApplicationDataContainer + { + /// Return the child settings containers of the settings container. + /// https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.containers Windows.Foundation.Map Containers { get; }; + + /// Return the name of the current settings container. + /// https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.name String Name { get; }; - Values Windows.Foundation.PropertySet { get; }; + + /// Return the type of the app data store that is associated with the settings container. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.locality + ApplicationDataLocality Locality { get; }; + + /// Return an object that represents the settings in the settings container. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.values + Windows.Foundation.PropertySet Values { get; }; void Close(); void Dispose(); + /// Create or open the specified settings container in the settings container. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.createcontainer ApplicationDataContainer CreateContainer(String name, ApplicationDataCreateDisposition disposition); + + /// Delete the specified settings container, its subcontainers, and all settings in the hierarchy. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.deletecontainer void DeleteContainer(String name); }; + /// Provides access to the application data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata [feature(Feature_PackageManager)] [contract(PackageDeploymentContract, 1)] runtimeclass ApplicationData { - /// Get an instance of ApplicationData + /// Get an instance of ApplicationData for the current user. /// @note Requires the current process has package identity. - /// @note This is equivalent to Windows.Stoarge.ApplicationData.Current. + /// @note This is equivalent to Windows.Storage.ApplicationData.Current if running in an AppContainer. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.CreateForPackageFamily(GetCurrentPackageFamilyName()) if not running in an AppContainer. static ApplicationData GetDefault(); - /// Get an instance of ApplicationData for the specified package family. - /// @note This is equivalent to Windows.Storage.ApplicationDataManager.CreateForPackageFamily() - static ApplicationData GetForPackageFamily(String packageFamilyName); - /// Get an instance of ApplicationData for the specified user. /// @note This is equivalent to Windows.Storage.ApplicationDataManager.GetForUserAsync() - Windows.Foundation.IAsyncOperation GetForUserAsync(Windows.System.User user); + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getforuserasync + Windows.Foundation.IAsyncOperation GetForUser(Windows.System.User user); - /// Get an instance of ApplicationData for the specified unpackaged app. + /// Get an instance of ApplicationData for the specified package family for the current user. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.CreateForPackageFamily() + /// @see https://learn.microsoft.com/uwp/api/windows.management.core.applicationdatamanager.createforpackagefamily + static ApplicationData GetForPackageFamily(String packageFamilyName); + + /// Get an instance of ApplicationData for the specified unpackaged app for the current user. static ApplicationData GetForUnpackaged(String publisher, String name); + /// Return the path for the local cache data store not included in backup and restore operations. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localcachefolder String LocalCachePath { get; }; + + /// Return the path for the local data store. This location is backed up to the cloud. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localfolder String LocalPath { get; }; + + /// Return the path for the machine data store. + /// @note This location is per-machine (not per-user like other *Path properties). String MachinePath { get; }; + + /// Return the path for the roaming data store. + /// @warning Roaming data and settings are no longer supported after Windows 10 version 1901 (aka 19H1 aka 10.0.18363.0). + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingfolder String RoamingPath { get; }; + + /// Return the path for the shared data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.sharedlocalfolder String SharedLocalPath { get; }; + + /// Return the path for the temporary data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.temporaryfolder String TemporaryPath { get; }; + /// Return a StorageFolder for the local cache data store not included in backup and restore operations. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localcachefolder Windows.Storage.StorageFolder LocalCacheFolder { get; }; + + /// Return a StorageFolder for the local data store. This location is backed up to the cloud. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localfolder Windows.Storage.StorageFolder LocalFolder { get; }; + + /// Return a StorageFolder for the machine data store. + /// @note This location is per-machine (not per-user like other *Folder properties). Windows.Storage.StorageFolder MachineFolder { get; }; + + /// Return a StorageFolder for the roaming data store. + /// @warning Roaming data and settings are no longer supported after Windows 10 version 1901 (aka 19H1 aka 10.0.18363.0). + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingfolder Windows.Storage.StorageFolder RoamingFolder { get; }; + + /// Return a StorageFolder for the shared data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.sharedlocalfolder Windows.Storage.StorageFolder SharedLocalFolder { get; }; + + /// Return a StorageFolder for the temporary data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.temporaryfolder Windows.Storage.StorageFolder TemporaryFolder { get; }; + /// Return the settings container in the local data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localsettings ApplicationDataContainer LocalSettings { get; }; + + /// Return the settings container in the roaming data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingsettings ApplicationDataContainer RoamingSettings { get; }; + /// Remove all data from the local, local cache, roaming, and temporary data stores. + /// @see LocalCachePath + /// @see LocalCacheFolder + /// @see LocalPath + /// @see LocalFolder + /// @see RoamingPath + /// @see RoamingFolder + /// @see TemporaryPath + /// @see TemporaryFolder + [method_name("ClearAllAsync")] Windows.Foundation.IAsyncAction ClearAsync(); - Windows.Foundation.IAsyncAction ClearPublisherCacheFolderAsync(); + + /// Remove all data from the specified data store. + Windows.Foundation.IAsyncAction ClearAsync(ApplicationDataLocality locality); + + /// Remove all data from the shared data store in the specified subfolder. + /// @see SharedLocalPath + /// @see SharedLocalFolder + Windows.Foundation.IAsyncAction ClearPublisherCacheFolderAsync(String folderName); + + /// Remove all data from machine data store. + /// @see MachineLocalPath + /// @see MachineLocalFolder Windows.Foundation.IAsyncAction ClearMachineFolderAsync(); void Close(); void Dispose(); - Windows.Storage.StorageFolder GetPublisherCacheFolder(String folderName); + /// Return the path for the shared data store for the publisher of the app. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getpublishercachefolder String GetPublisherCachePath(String folderName); + + /// Return a StorageFolder for the shared data store for the publisher of the app. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getpublishercachefolder + Windows.Storage.StorageFolder GetPublisherCacheFolder(String folderName); } } diff --git a/dev/Common/TerminalVelocityFeatures-ApplicationData.h b/dev/Common/TerminalVelocityFeatures-ApplicationData.h new file mode 100644 index 0000000000..20908e82ca --- /dev/null +++ b/dev/Common/TerminalVelocityFeatures-ApplicationData.h @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +// THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT IT + +// INPUT FILE: dev\Common\TerminalVelocityFeatures-ApplicationData.xml +// OPTIONS: -Channel Experimental -Language C++ -Namespace Microsoft.Windows.Storage.ApplicationData -Path dev\Common\TerminalVelocityFeatures-ApplicationData.xml -Output dev\Common\TerminalVelocityFeatures-ApplicationData.h + +#if defined(__midlrt) +namespace features +{ + feature_name Feature_ApplicationData = { DisabledByDefault, FALSE }; +} +#endif // defined(__midlrt) + +// Feature constants +#define WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_STORAGE_APPLICATIONDATA_FEATURE_APPLICATIONDATA_ENABLED 1 + +#if defined(__cplusplus) + +namespace Microsoft::Windows::Storage::ApplicationData +{ + +__pragma(detect_mismatch("ODR_violation_WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_STORAGE_APPLICATIONDATA_FEATURE_APPLICATIONDATA_ENABLED_mismatch", "AlwaysEnabled")) +struct Feature_ApplicationData +{ + static constexpr bool IsEnabled() { return WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_STORAGE_APPLICATIONDATA_FEATURE_APPLICATIONDATA_ENABLED == 1; } +}; + +} // namespace Microsoft.Windows.Storage.ApplicationData + +#endif // defined(__cplusplus) diff --git a/dev/Common/TerminalVelocityFeatures-ApplicationData.xml b/dev/Common/TerminalVelocityFeatures-ApplicationData.xml new file mode 100644 index 0000000000..0c3d063a4f --- /dev/null +++ b/dev/Common/TerminalVelocityFeatures-ApplicationData.xml @@ -0,0 +1,20 @@ + + + + + + + + + + Feature_ApplicationData + ApplicationData APIs + AlwaysEnabled + + Preview + Stable + + + From d8d8ce0f6f1612ac4304120b852336500b3d518f Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sun, 24 Dec 2023 17:14:21 -0800 Subject: [PATCH 07/22] Added stub implementations --- WindowsAppRuntime.sln | 1 + dev/ApplicationData/ApplicationData.idl | 14 +-- dev/ApplicationData/ApplicationData.vcxitems | 3 +- .../ApplicationData.vcxitems.filters | 5 +- dev/ApplicationData/M.W.S.ApplicationData.cpp | 115 ++++++++++++++++++ dev/ApplicationData/M.W.S.ApplicationData.h | 47 +++++++ .../M.W.S.ApplicationDataContainer.cpp | 43 +++++++ .../M.W.S.ApplicationDataContainer.h | 23 ++++ .../WindowsAppRuntime_DLL.vcxproj | 1 + 9 files changed, 243 insertions(+), 9 deletions(-) create mode 100644 dev/ApplicationData/M.W.S.ApplicationData.cpp create mode 100644 dev/ApplicationData/M.W.S.ApplicationData.h create mode 100644 dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp create mode 100644 dev/ApplicationData/M.W.S.ApplicationDataContainer.h diff --git a/WindowsAppRuntime.sln b/WindowsAppRuntime.sln index a60acdddc3..9da2dd368d 100644 --- a/WindowsAppRuntime.sln +++ b/WindowsAppRuntime.sln @@ -2621,6 +2621,7 @@ Global dev\AppNotifications\AppNotifications.vcxitems*{b4824897-88e0-4927-8fb9-e60106f01ed9}*SharedItemsImports = 9 test\inc\inc.vcxitems*{b567fe2e-3a03-48d0-b2b5-760cdec35891}*SharedItemsImports = 9 dev\Workloads\Workloads.vcxitems*{b5798ceb-4e60-4d2d-b456-7c406b5f5b67}*SharedItemsImports = 9 + dev\ApplicationData\ApplicationData.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\Common\Common.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\DynamicDependency\API\DynamicDependency.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\Licensing\Licensing.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index 7e57d2996b..e102fc1d6a 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -35,7 +35,7 @@ namespace Microsoft.Windows.Storage // Returns the specified container only if it already exists. Raises an exception of type System.Exception if the specified container does not exist. Existing, - } ApplicationDataCreateDisposition; + }; /// Represents a container for settings. The methods and properties of this class support creating, deleting, enumerating, and traversing the container hierarchy. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer @@ -45,7 +45,7 @@ namespace Microsoft.Windows.Storage { /// Return the child settings containers of the settings container. /// https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.containers - Windows.Foundation.Map Containers { get; }; + IMapView Containers { get; }; /// Return the name of the current settings container. /// https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.name @@ -57,7 +57,7 @@ namespace Microsoft.Windows.Storage /// Return an object that represents the settings in the settings container. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.values - Windows.Foundation.PropertySet Values { get; }; + Windows.Foundation.Collections.PropertySet Values { get; }; void Close(); void Dispose(); @@ -73,8 +73,8 @@ namespace Microsoft.Windows.Storage /// Provides access to the application data store. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata - [feature(Feature_PackageManager)] - [contract(PackageDeploymentContract, 1)] + [feature(Feature_ApplicationData)] + [contract(ApplicationDataContract, 1)] runtimeclass ApplicationData { /// Get an instance of ApplicationData for the current user. @@ -163,8 +163,8 @@ namespace Microsoft.Windows.Storage /// @see RoamingFolder /// @see TemporaryPath /// @see TemporaryFolder - [method_name("ClearAllAsync")] - Windows.Foundation.IAsyncAction ClearAsync(); + [method_name("ClearAsync")] + Windows.Foundation.IAsyncAction ClearAllAsync(); /// Remove all data from the specified data store. Windows.Foundation.IAsyncAction ClearAsync(ApplicationDataLocality locality); diff --git a/dev/ApplicationData/ApplicationData.vcxitems b/dev/ApplicationData/ApplicationData.vcxitems index a38739b560..492bd558e3 100644 --- a/dev/ApplicationData/ApplicationData.vcxitems +++ b/dev/ApplicationData/ApplicationData.vcxitems @@ -20,8 +20,9 @@ + - + \ No newline at end of file diff --git a/dev/ApplicationData/ApplicationData.vcxitems.filters b/dev/ApplicationData/ApplicationData.vcxitems.filters index 00da0cc045..68b04f43e2 100644 --- a/dev/ApplicationData/ApplicationData.vcxitems.filters +++ b/dev/ApplicationData/ApplicationData.vcxitems.filters @@ -25,8 +25,11 @@ Header Files + + Header Files + - + \ No newline at end of file diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp new file mode 100644 index 0000000000..74d22f7eb3 --- /dev/null +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -0,0 +1,115 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include "M.W.S.ApplicationData.h" +#include "Microsoft.Windows.Storage.ApplicationData.g.cpp" + +namespace winrt::Microsoft::Windows::Storage::implementation +{ + winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetDefault() + { + throw hresult_not_implemented(); + } + winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForPackageFamily(hstring const& packageFamilyName) + { + throw hresult_not_implemented(); + } + winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUnpackaged(hstring const& publisher, hstring const& name) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperation ApplicationData::GetForUser(winrt::Windows::System::User user) + { + throw hresult_not_implemented(); + } + hstring ApplicationData::LocalCachePath() + { + throw hresult_not_implemented(); + } + hstring ApplicationData::LocalPath() + { + throw hresult_not_implemented(); + } + hstring ApplicationData::MachinePath() + { + throw hresult_not_implemented(); + } + hstring ApplicationData::RoamingPath() + { + throw hresult_not_implemented(); + } + hstring ApplicationData::SharedLocalPath() + { + throw hresult_not_implemented(); + } + hstring ApplicationData::TemporaryPath() + { + throw hresult_not_implemented(); + } + winrt::Windows::Storage::StorageFolder ApplicationData::LocalCacheFolder() + { + throw hresult_not_implemented(); + } + winrt::Windows::Storage::StorageFolder ApplicationData::LocalFolder() + { + throw hresult_not_implemented(); + } + winrt::Windows::Storage::StorageFolder ApplicationData::MachineFolder() + { + throw hresult_not_implemented(); + } + winrt::Windows::Storage::StorageFolder ApplicationData::RoamingFolder() + { + throw hresult_not_implemented(); + } + winrt::Windows::Storage::StorageFolder ApplicationData::SharedLocalFolder() + { + throw hresult_not_implemented(); + } + winrt::Windows::Storage::StorageFolder ApplicationData::TemporaryFolder() + { + throw hresult_not_implemented(); + } + winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::LocalSettings() + { + throw hresult_not_implemented(); + } + winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::RoamingSettings() + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAllAsync() + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearPublisherCacheFolderAsync(hstring folderName) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearMachineFolderAsync() + { + throw hresult_not_implemented(); + } + void ApplicationData::Close() + { + throw hresult_not_implemented(); + } + void ApplicationData::Dispose() + { + throw hresult_not_implemented(); + } + hstring ApplicationData::GetPublisherCachePath(hstring const& folderName) + { + throw hresult_not_implemented(); + } + winrt::Windows::Storage::StorageFolder ApplicationData::GetPublisherCacheFolder(hstring const& folderName) + { + throw hresult_not_implemented(); + } +} diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h new file mode 100644 index 0000000000..ffa398e54e --- /dev/null +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Storage.ApplicationData.g.h" + +namespace winrt::Microsoft::Windows::Storage::implementation +{ + struct ApplicationData : ApplicationDataT + { + ApplicationData() = default; + + static winrt::Microsoft::Windows::Storage::ApplicationData GetDefault(); + static winrt::Microsoft::Windows::Storage::ApplicationData GetForPackageFamily(hstring const& packageFamilyName); + static winrt::Microsoft::Windows::Storage::ApplicationData GetForUnpackaged(hstring const& publisher, hstring const& name); + winrt::Windows::Foundation::IAsyncOperation GetForUser(winrt::Windows::System::User user); + hstring LocalCachePath(); + hstring LocalPath(); + hstring MachinePath(); + hstring RoamingPath(); + hstring SharedLocalPath(); + hstring TemporaryPath(); + winrt::Windows::Storage::StorageFolder LocalCacheFolder(); + winrt::Windows::Storage::StorageFolder LocalFolder(); + winrt::Windows::Storage::StorageFolder MachineFolder(); + winrt::Windows::Storage::StorageFolder RoamingFolder(); + winrt::Windows::Storage::StorageFolder SharedLocalFolder(); + winrt::Windows::Storage::StorageFolder TemporaryFolder(); + winrt::Microsoft::Windows::Storage::ApplicationDataContainer LocalSettings(); + winrt::Microsoft::Windows::Storage::ApplicationDataContainer RoamingSettings(); + winrt::Windows::Foundation::IAsyncAction ClearAllAsync(); + winrt::Windows::Foundation::IAsyncAction ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality); + winrt::Windows::Foundation::IAsyncAction ClearPublisherCacheFolderAsync(hstring folderName); + winrt::Windows::Foundation::IAsyncAction ClearMachineFolderAsync(); + void Close(); + void Dispose(); + hstring GetPublisherCachePath(hstring const& folderName); + winrt::Windows::Storage::StorageFolder GetPublisherCacheFolder(hstring const& folderName); + }; +} +namespace winrt::Microsoft::Windows::Storage::factory_implementation +{ + struct ApplicationData : ApplicationDataT + { + }; +} diff --git a/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp b/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp new file mode 100644 index 0000000000..d5d472e9f8 --- /dev/null +++ b/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include "M.W.S.ApplicationDataContainer.h" +#include "Microsoft.Windows.Storage.ApplicationDataContainer.g.cpp" + +namespace winrt::Microsoft::Windows::Storage::implementation +{ + winrt::Windows::Foundation::Collections::IMapView ApplicationDataContainer::Containers() + { + throw hresult_not_implemented(); + } + hstring ApplicationDataContainer::Name() + { + throw hresult_not_implemented(); + } + winrt::Microsoft::Windows::Storage::ApplicationDataLocality ApplicationDataContainer::Locality() + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::Collections::PropertySet ApplicationDataContainer::Values() + { + throw hresult_not_implemented(); + } + void ApplicationDataContainer::Close() + { + throw hresult_not_implemented(); + } + void ApplicationDataContainer::Dispose() + { + throw hresult_not_implemented(); + } + winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationDataContainer::CreateContainer(hstring const& name, winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition const& disposition) + { + throw hresult_not_implemented(); + } + void ApplicationDataContainer::DeleteContainer(hstring const& name) + { + throw hresult_not_implemented(); + } +} diff --git a/dev/ApplicationData/M.W.S.ApplicationDataContainer.h b/dev/ApplicationData/M.W.S.ApplicationDataContainer.h new file mode 100644 index 0000000000..c77f82ae61 --- /dev/null +++ b/dev/ApplicationData/M.W.S.ApplicationDataContainer.h @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Storage.ApplicationDataContainer.g.h" + +namespace winrt::Microsoft::Windows::Storage::implementation +{ + struct ApplicationDataContainer : ApplicationDataContainerT + { + ApplicationDataContainer() = default; + + winrt::Windows::Foundation::Collections::IMapView Containers(); + hstring Name(); + winrt::Microsoft::Windows::Storage::ApplicationDataLocality Locality(); + winrt::Windows::Foundation::Collections::PropertySet Values(); + void Close(); + void Dispose(); + winrt::Microsoft::Windows::Storage::ApplicationDataContainer CreateContainer(hstring const& name, winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition const& disposition); + void DeleteContainer(hstring const& name); + }; +} diff --git a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj index 464bf011be..bf024d69ed 100644 --- a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj +++ b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj @@ -85,6 +85,7 @@ + From f121d12f4737c122074c457979148ca7281d912c Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sun, 24 Dec 2023 17:59:00 -0800 Subject: [PATCH 08/22] Initial implementation --- dev/ApplicationData/ApplicationData.idl | 2 +- dev/ApplicationData/M.W.S.ApplicationData.cpp | 34 ++++++++++++------- dev/ApplicationData/M.W.S.ApplicationData.h | 6 +++- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index e102fc1d6a..b1d1eb2f61 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -86,7 +86,7 @@ namespace Microsoft.Windows.Storage /// Get an instance of ApplicationData for the specified user. /// @note This is equivalent to Windows.Storage.ApplicationDataManager.GetForUserAsync() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getforuserasync - Windows.Foundation.IAsyncOperation GetForUser(Windows.System.User user); + static ApplicationData GetForUser(Windows.System.User user); /// Get an instance of ApplicationData for the specified package family for the current user. /// @note This is equivalent to Windows.Storage.ApplicationDataManager.CreateForPackageFamily() diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 74d22f7eb3..556fb4c699 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -6,8 +6,17 @@ #include "M.W.S.ApplicationData.h" #include "Microsoft.Windows.Storage.ApplicationData.g.cpp" +static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Local)); +static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::LocalCache) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::LocalCache)); +static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Roaming)); +static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Temporary) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Temporary)); + namespace winrt::Microsoft::Windows::Storage::implementation { + ApplicationData::ApplicationData(winrt::Windows::Storage::ApplicationData const& value) : + m_applicationData(value) + { + } winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetDefault() { throw hresult_not_implemented(); @@ -20,17 +29,18 @@ namespace winrt::Microsoft::Windows::Storage::implementation { throw hresult_not_implemented(); } - winrt::Windows::Foundation::IAsyncOperation ApplicationData::GetForUser(winrt::Windows::System::User user) + winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUser(winrt::Windows::System::User user) { - throw hresult_not_implemented(); + auto applicationData{ winrt::Windows::Storage::ApplicationData::GetForUserAsync(user).get() }; + return winrt::make(applicationData); } hstring ApplicationData::LocalCachePath() { - throw hresult_not_implemented(); + return m_applicationData.LocalCacheFolder().Path(); } hstring ApplicationData::LocalPath() { - throw hresult_not_implemented(); + return m_applicationData.LocalFolder().Path(); } hstring ApplicationData::MachinePath() { @@ -38,7 +48,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::RoamingPath() { - throw hresult_not_implemented(); + return m_applicationData.RoamingFolder().Path(); } hstring ApplicationData::SharedLocalPath() { @@ -46,15 +56,15 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::TemporaryPath() { - throw hresult_not_implemented(); + return m_applicationData.TemporaryFolder().Path(); } winrt::Windows::Storage::StorageFolder ApplicationData::LocalCacheFolder() { - throw hresult_not_implemented(); + return m_applicationData.LocalCacheFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::LocalFolder() { - throw hresult_not_implemented(); + return m_applicationData.LocalFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::MachineFolder() { @@ -62,7 +72,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation } winrt::Windows::Storage::StorageFolder ApplicationData::RoamingFolder() { - throw hresult_not_implemented(); + return m_applicationData.RoamingFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::SharedLocalFolder() { @@ -70,7 +80,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation } winrt::Windows::Storage::StorageFolder ApplicationData::TemporaryFolder() { - throw hresult_not_implemented(); + return m_applicationData.TemporaryFolder(); } winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::LocalSettings() { @@ -82,11 +92,11 @@ namespace winrt::Microsoft::Windows::Storage::implementation } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAllAsync() { - throw hresult_not_implemented(); + return m_applicationData.ClearAsync(); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality) { - throw hresult_not_implemented(); + return m_applicationData.ClearAsync(static_cast(locality)); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearPublisherCacheFolderAsync(hstring folderName) { diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index ffa398e54e..8d85b43d9a 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -10,11 +10,12 @@ namespace winrt::Microsoft::Windows::Storage::implementation struct ApplicationData : ApplicationDataT { ApplicationData() = default; + ApplicationData(winrt::Windows::Storage::ApplicationData const& value); static winrt::Microsoft::Windows::Storage::ApplicationData GetDefault(); static winrt::Microsoft::Windows::Storage::ApplicationData GetForPackageFamily(hstring const& packageFamilyName); static winrt::Microsoft::Windows::Storage::ApplicationData GetForUnpackaged(hstring const& publisher, hstring const& name); - winrt::Windows::Foundation::IAsyncOperation GetForUser(winrt::Windows::System::User user); + static winrt::Microsoft::Windows::Storage::ApplicationData GetForUser(winrt::Windows::System::User user); hstring LocalCachePath(); hstring LocalPath(); hstring MachinePath(); @@ -37,6 +38,9 @@ namespace winrt::Microsoft::Windows::Storage::implementation void Dispose(); hstring GetPublisherCachePath(hstring const& folderName); winrt::Windows::Storage::StorageFolder GetPublisherCacheFolder(hstring const& folderName); + + private: + winrt::Windows::Storage::ApplicationData m_applicationData; }; } namespace winrt::Microsoft::Windows::Storage::factory_implementation From 31aaf7f11e818bb0feb68b5a3c7a51f4d027e9b5 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sun, 24 Dec 2023 23:23:35 -0800 Subject: [PATCH 09/22] Implemented ApplicationData --- .../AppNotificationUtility.cpp | 2 +- dev/ApplicationData/ApplicationData.idl | 17 ++-- dev/ApplicationData/ApplicationData.vcxitems | 7 +- .../ApplicationData.vcxitems.filters | 11 ++- .../ApplicationDataTelemetry.h | 29 +++++++ dev/ApplicationData/M.W.S.ApplicationData.cpp | 79 +++++++++++++------ dev/ApplicationData/M.W.S.ApplicationData.h | 7 +- .../M.W.S.ApplicationDataContainer.cpp | 42 +++++++--- .../M.W.S.ApplicationDataContainer.h | 9 ++- dev/ApplicationData/pch.h | 3 + dev/Common/AppModel.Identity.h | 27 +++++++ dev/Common/NotificationTelemetryHelper.h | 2 +- .../DynamicDependency.DataStore/winmain.cpp | 2 +- .../winmain.cpp | 2 +- dev/Kozani/KozaniHostRuntime/main.cpp | 6 +- .../PushNotificationUtility.h | 2 +- 16 files changed, 181 insertions(+), 66 deletions(-) create mode 100644 dev/ApplicationData/ApplicationDataTelemetry.h diff --git a/dev/AppNotifications/AppNotificationUtility.cpp b/dev/AppNotifications/AppNotificationUtility.cpp index 293cfddf0e..b05b9e975c 100644 --- a/dev/AppNotifications/AppNotificationUtility.cpp +++ b/dev/AppNotifications/AppNotificationUtility.cpp @@ -102,7 +102,7 @@ std::wstring Microsoft::Windows::AppNotifications::Helpers::RetrieveNotification wchar_t appUserModelId[APPLICATION_USER_MODEL_ID_MAX_LENGTH] = {}; UINT32 appUserModelIdSize{ APPLICATION_USER_MODEL_ID_MAX_LENGTH }; - THROW_IF_FAILED(GetCurrentApplicationUserModelId(&appUserModelIdSize, appUserModelId)); + THROW_IF_FAILED(::GetCurrentApplicationUserModelId(&appUserModelIdSize, appUserModelId)); return appUserModelId; } else diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index b1d1eb2f61..10dfce9cdc 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -41,11 +41,11 @@ namespace Microsoft.Windows.Storage /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] - runtimeclass ApplicationDataContainer + runtimeclass ApplicationDataContainer : Windows.Foundation.IClosable { /// Return the child settings containers of the settings container. /// https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.containers - IMapView Containers { get; }; + IMap Containers { get; }; /// Return the name of the current settings container. /// https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.name @@ -57,10 +57,7 @@ namespace Microsoft.Windows.Storage /// Return an object that represents the settings in the settings container. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.values - Windows.Foundation.Collections.PropertySet Values { get; }; - - void Close(); - void Dispose(); + Windows.Foundation.Collections.IPropertySet Values { get; }; /// Create or open the specified settings container in the settings container. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer.createcontainer @@ -75,7 +72,7 @@ namespace Microsoft.Windows.Storage /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] - runtimeclass ApplicationData + runtimeclass ApplicationData : Windows.Foundation.IClosable { /// Get an instance of ApplicationData for the current user. /// @note Requires the current process has package identity. @@ -96,6 +93,9 @@ namespace Microsoft.Windows.Storage /// Get an instance of ApplicationData for the specified unpackaged app for the current user. static ApplicationData GetForUnpackaged(String publisher, String name); + /// Return true if the package family supports the machine data store. + Boolean IsMachinePathSupported(); + /// Return the path for the local cache data store not included in backup and restore operations. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localcachefolder String LocalCachePath { get; }; @@ -179,9 +179,6 @@ namespace Microsoft.Windows.Storage /// @see MachineLocalFolder Windows.Foundation.IAsyncAction ClearMachineFolderAsync(); - void Close(); - void Dispose(); - /// Return the path for the shared data store for the publisher of the app. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getpublishercachefolder String GetPublisherCachePath(String folderName); diff --git a/dev/ApplicationData/ApplicationData.vcxitems b/dev/ApplicationData/ApplicationData.vcxitems index 492bd558e3..32e3851ac8 100644 --- a/dev/ApplicationData/ApplicationData.vcxitems +++ b/dev/ApplicationData/ApplicationData.vcxitems @@ -14,15 +14,16 @@ - + - + + - \ No newline at end of file + diff --git a/dev/ApplicationData/ApplicationData.vcxitems.filters b/dev/ApplicationData/ApplicationData.vcxitems.filters index 68b04f43e2..215fe7b0dc 100644 --- a/dev/ApplicationData/ApplicationData.vcxitems.filters +++ b/dev/ApplicationData/ApplicationData.vcxitems.filters @@ -11,18 +11,21 @@ - + Source Files - + Source Files + + Header Files + Header Files - + Header Files @@ -32,4 +35,4 @@ - \ No newline at end of file + diff --git a/dev/ApplicationData/ApplicationDataTelemetry.h b/dev/ApplicationData/ApplicationDataTelemetry.h new file mode 100644 index 0000000000..9ce1d58fc5 --- /dev/null +++ b/dev/ApplicationData/ApplicationDataTelemetry.h @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT license. + +#pragma once + +#include + +DECLARE_TRACELOGGING_CLASS(ApplicationDataTelemetryProvider, + "Microsoft.WindowsAppSDK.Notifications.ApplicationDataTelemetry", + // {cb014b10-5b3b-4117-a837-07b138bb519f} + (0xcb014b10, 0x5b3b, 0x4117, 0xa8, 0x37, 0x07, 0xb1, 0x38, 0xbb, 0x51, 0x9f)); + +class ApplicationDataTelemetry : public wil::TraceLoggingProvider +{ + IMPLEMENT_TELEMETRY_CLASS(ApplicationDataTelemetry, ApplicationDataTelemetryProvider); + +public: + + BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS(ClearMachineFolderAsync, PDT_ProductAndServicePerformance); + DEFINE_ACTIVITY_START(winrt::hstring const& path) noexcept try + { + TraceLoggingClassWriteStart( + ClearMachineFolderAsync, + _GENERIC_PARTB_FIELDS_ENABLED, + TraceLoggingWideString(path.c_str(), "Path")); + } + CATCH_LOG() + END_ACTIVITY_CLASS(); +}; diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 556fb4c699..a19c04e012 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -6,6 +6,12 @@ #include "M.W.S.ApplicationData.h" #include "Microsoft.Windows.Storage.ApplicationData.g.cpp" +#include "M.W.S.ApplicationDataContainer.h" + +#include + +#include "ApplicationDataTelemetry.h" + static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Local)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::LocalCache) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::LocalCache)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Roaming)); @@ -13,26 +19,40 @@ static_assert(static_cast(winrt::Microsoft::Windows::Storage::Applicati namespace winrt::Microsoft::Windows::Storage::implementation { - ApplicationData::ApplicationData(winrt::Windows::Storage::ApplicationData const& value) : - m_applicationData(value) + ApplicationData::ApplicationData(winrt::Windows::Storage::ApplicationData const& value, hstring const& packageFamilyName) : + m_applicationData(value), + m_packageFamilyName(packageFamilyName) { } winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetDefault() { - throw hresult_not_implemented(); + const auto packageFamilyName{ ::AppModel::Identity::GetCurrentPackageFamilyName() }; + auto applicationData{ winrt::Windows::Storage::ApplicationData::Current() }; + return winrt::make(applicationData, packageFamilyName); + } + winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUser(winrt::Windows::System::User user) + { + const auto packageFamilyName{ ::AppModel::Identity::GetCurrentPackageFamilyName() }; + auto applicationData{ winrt::Windows::Storage::ApplicationData::GetForUserAsync(user).get() }; + return winrt::make(applicationData, packageFamilyName); } winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForPackageFamily(hstring const& packageFamilyName) { - throw hresult_not_implemented(); + auto applicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + return winrt::make(applicationData, packageFamilyName); } winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUnpackaged(hstring const& publisher, hstring const& name) { + // TODO implement GetForUnpackaged throw hresult_not_implemented(); } - winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUser(winrt::Windows::System::User user) + bool ApplicationData::IsMachinePathSupported() { - auto applicationData{ winrt::Windows::Storage::ApplicationData::GetForUserAsync(user).get() }; - return winrt::make(applicationData); +#if defined(TODO_FrameworkUdk__ApplicationData_MachinePathIsSupported) + bool isSupported{}; + THROW_IF_FAILED(ApplicationData_IsMachinePathSupported(m_packageFamilyName.c_str(), isSupported)); +#endif + return false; } hstring ApplicationData::LocalCachePath() { @@ -44,7 +64,11 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::MachinePath() { - throw hresult_not_implemented(); + wil::unique_cotaskmem_string programData; + THROW_IF_FAILED(::SHGetKnownFolderPath(FOLDERID_ProgramData, 0, nullptr, wil::out_param(programData))); + std::filesystem::path path{ programData.get() }; + path /= m_packageFamilyName.c_str(); + return hstring{ path.c_str() }; } hstring ApplicationData::RoamingPath() { @@ -52,7 +76,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::SharedLocalPath() { - throw hresult_not_implemented(); + return m_applicationData.SharedLocalFolder().Path(); } hstring ApplicationData::TemporaryPath() { @@ -68,7 +92,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation } winrt::Windows::Storage::StorageFolder ApplicationData::MachineFolder() { - throw hresult_not_implemented(); + return winrt::Windows::Storage::StorageFolder::GetFolderFromPathAsync(MachinePath()).get(); } winrt::Windows::Storage::StorageFolder ApplicationData::RoamingFolder() { @@ -76,7 +100,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation } winrt::Windows::Storage::StorageFolder ApplicationData::SharedLocalFolder() { - throw hresult_not_implemented(); + return m_applicationData.SharedLocalFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::TemporaryFolder() { @@ -84,11 +108,13 @@ namespace winrt::Microsoft::Windows::Storage::implementation } winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::LocalSettings() { - throw hresult_not_implemented(); + auto applicationDataContainer{ m_applicationData.LocalSettings() }; + return winrt::make(applicationDataContainer); } winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::RoamingSettings() { - throw hresult_not_implemented(); + auto applicationDataContainer{ m_applicationData.RoamingSettings() }; + return winrt::make(applicationDataContainer); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAllAsync() { @@ -100,26 +126,35 @@ namespace winrt::Microsoft::Windows::Storage::implementation } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearPublisherCacheFolderAsync(hstring folderName) { - throw hresult_not_implemented(); + return m_applicationData.ClearPublisherCacheFolderAsync(folderName); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearMachineFolderAsync() { - throw hresult_not_implemented(); + const auto path{ MachinePath() }; + + auto logTelemetry{ ApplicationDataTelemetry::ClearMachineFolderAsync::Start(path) }; + + auto strong{ get_strong() }; + + logTelemetry.IgnoreCurrentThread(); + co_await winrt::resume_background(); + auto logTelemetryContinuation{ logTelemetry.ContinueOnCurrentThread() }; + + const auto options{ wil::RemoveDirectoryOptions::KeepRootDirectory | wil::RemoveDirectoryOptions::RemoveReadOnly }; + wil::RemoveDirectoryRecursive(path.c_str(), options); + + logTelemetry.Stop(); } void ApplicationData::Close() { - throw hresult_not_implemented(); - } - void ApplicationData::Dispose() - { - throw hresult_not_implemented(); + m_applicationData.Close(); } hstring ApplicationData::GetPublisherCachePath(hstring const& folderName) { - throw hresult_not_implemented(); + return m_applicationData.GetPublisherCacheFolder(folderName).Path(); } winrt::Windows::Storage::StorageFolder ApplicationData::GetPublisherCacheFolder(hstring const& folderName) { - throw hresult_not_implemented(); + return m_applicationData.GetPublisherCacheFolder(folderName); } } diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index 8d85b43d9a..06ce7799b6 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -10,12 +10,13 @@ namespace winrt::Microsoft::Windows::Storage::implementation struct ApplicationData : ApplicationDataT { ApplicationData() = default; - ApplicationData(winrt::Windows::Storage::ApplicationData const& value); + ApplicationData(winrt::Windows::Storage::ApplicationData const& value, hstring const& packageFamilyName); static winrt::Microsoft::Windows::Storage::ApplicationData GetDefault(); + static winrt::Microsoft::Windows::Storage::ApplicationData GetForUser(winrt::Windows::System::User user); static winrt::Microsoft::Windows::Storage::ApplicationData GetForPackageFamily(hstring const& packageFamilyName); static winrt::Microsoft::Windows::Storage::ApplicationData GetForUnpackaged(hstring const& publisher, hstring const& name); - static winrt::Microsoft::Windows::Storage::ApplicationData GetForUser(winrt::Windows::System::User user); + bool IsMachinePathSupported(); hstring LocalCachePath(); hstring LocalPath(); hstring MachinePath(); @@ -35,12 +36,12 @@ namespace winrt::Microsoft::Windows::Storage::implementation winrt::Windows::Foundation::IAsyncAction ClearPublisherCacheFolderAsync(hstring folderName); winrt::Windows::Foundation::IAsyncAction ClearMachineFolderAsync(); void Close(); - void Dispose(); hstring GetPublisherCachePath(hstring const& folderName); winrt::Windows::Storage::StorageFolder GetPublisherCacheFolder(hstring const& folderName); private: winrt::Windows::Storage::ApplicationData m_applicationData; + winrt::hstring m_packageFamilyName; }; } namespace winrt::Microsoft::Windows::Storage::factory_implementation diff --git a/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp b/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp index d5d472e9f8..fe6ab3ea48 100644 --- a/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp @@ -8,36 +8,52 @@ namespace winrt::Microsoft::Windows::Storage::implementation { - winrt::Windows::Foundation::Collections::IMapView ApplicationDataContainer::Containers() + ApplicationDataContainer::ApplicationDataContainer(winrt::Windows::Storage::ApplicationDataContainer const& value) : + m_applicationDataContainer(value) { - throw hresult_not_implemented(); + } + winrt::Windows::Foundation::Collections::IMap ApplicationDataContainer::Containers() + { + winrt::Windows::Foundation::Collections::IMap map{ winrt::single_threaded_map() }; + auto containers{ m_applicationDataContainer.Containers() }; + for (auto container : containers) + { + auto value{ winrt::make(container.Value()) }; + map.Insert(container.Key(), value); + } + return map; } hstring ApplicationDataContainer::Name() { - throw hresult_not_implemented(); + return m_applicationDataContainer.Name(); } winrt::Microsoft::Windows::Storage::ApplicationDataLocality ApplicationDataContainer::Locality() { - throw hresult_not_implemented(); + static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Local)); + static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::LocalCache) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::LocalCache)); + static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Roaming)); + static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Temporary) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Temporary)); + + return static_cast(m_applicationDataContainer.Locality()); } - winrt::Windows::Foundation::Collections::PropertySet ApplicationDataContainer::Values() + winrt::Windows::Foundation::Collections::IPropertySet ApplicationDataContainer::Values() { - throw hresult_not_implemented(); + return m_applicationDataContainer.Values(); } void ApplicationDataContainer::Close() { - throw hresult_not_implemented(); - } - void ApplicationDataContainer::Dispose() - { - throw hresult_not_implemented(); + return m_applicationDataContainer.Close(); } winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationDataContainer::CreateContainer(hstring const& name, winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition const& disposition) { - throw hresult_not_implemented(); + static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition::Always) == static_cast(winrt::Windows::Storage::ApplicationDataCreateDisposition::Always)); + static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition::Existing) == static_cast(winrt::Windows::Storage::ApplicationDataCreateDisposition::Existing)); + + auto container{ m_applicationDataContainer.CreateContainer(name, static_cast(disposition)) }; + return winrt::make(container); } void ApplicationDataContainer::DeleteContainer(hstring const& name) { - throw hresult_not_implemented(); + m_applicationDataContainer.DeleteContainer(name); } } diff --git a/dev/ApplicationData/M.W.S.ApplicationDataContainer.h b/dev/ApplicationData/M.W.S.ApplicationDataContainer.h index c77f82ae61..cb96cb97af 100644 --- a/dev/ApplicationData/M.W.S.ApplicationDataContainer.h +++ b/dev/ApplicationData/M.W.S.ApplicationDataContainer.h @@ -10,14 +10,17 @@ namespace winrt::Microsoft::Windows::Storage::implementation struct ApplicationDataContainer : ApplicationDataContainerT { ApplicationDataContainer() = default; + ApplicationDataContainer(winrt::Windows::Storage::ApplicationDataContainer const& value); - winrt::Windows::Foundation::Collections::IMapView Containers(); + winrt::Windows::Foundation::Collections::IMap Containers(); hstring Name(); winrt::Microsoft::Windows::Storage::ApplicationDataLocality Locality(); - winrt::Windows::Foundation::Collections::PropertySet Values(); + winrt::Windows::Foundation::Collections::IPropertySet Values(); void Close(); - void Dispose(); winrt::Microsoft::Windows::Storage::ApplicationDataContainer CreateContainer(hstring const& name, winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition const& disposition); void DeleteContainer(hstring const& name); + + private: + winrt::Windows::Storage::ApplicationDataContainer m_applicationDataContainer; }; } diff --git a/dev/ApplicationData/pch.h b/dev/ApplicationData/pch.h index 44cdd5d542..ea70ffe5bb 100644 --- a/dev/ApplicationData/pch.h +++ b/dev/ApplicationData/pch.h @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -22,3 +23,5 @@ #include #include #include + +#include diff --git a/dev/Common/AppModel.Identity.h b/dev/Common/AppModel.Identity.h index fa0f646b29..537ed8a23c 100644 --- a/dev/Common/AppModel.Identity.h +++ b/dev/Common/AppModel.Identity.h @@ -19,6 +19,33 @@ inline bool IsPackagedProcess() return rc == ERROR_INSUFFICIENT_BUFFER; } +template +inline Tstring GetCurrentPackageFullName() +{ + WCHAR packageFullName[PACKAGE_FULL_NAME_MAX_LENGTH + 1]{}; + UINT32 n{ ARRAYSIZE(packageFullName) }; + THROW_IF_WIN32_ERROR(::GetCurrentPackageFullName(&n, packageFullName)); + return Tstring{ packageFullName }; +} + +template +inline Tstring GetCurrentPackageFamilyName() +{ + WCHAR packageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; + UINT32 n{ ARRAYSIZE(packageFamilyName) }; + THROW_IF_WIN32_ERROR(::GetCurrentPackageFamilyName(&n, packageFamilyName)); + return Tstring{ packageFamilyName }; +} + +template +inline Tstring GetCurrentApplicationUserModelId() +{ + WCHAR applicationUserModelId[APPLICATION_USER_MODEL_ID_MAX_LENGTH]{}; + UINT32 n{ ARRAYSIZE(applicationUserModelId) }; + THROW_IF_WIN32_ERROR(::GetCurrentApplicationUserModelId(&n, applicationUserModelId)); + return Tstring{ applicationUserModelId }; +} + constexpr winrt::Windows::System::ProcessorArchitecture GetCurrentArchitecture() { #if defined(_M_X64) diff --git a/dev/Common/NotificationTelemetryHelper.h b/dev/Common/NotificationTelemetryHelper.h index d682c5fd77..2c97970a4e 100644 --- a/dev/Common/NotificationTelemetryHelper.h +++ b/dev/Common/NotificationTelemetryHelper.h @@ -31,7 +31,7 @@ class NotificationTelemetryHelper wchar_t appUserModelId[APPLICATION_USER_MODEL_ID_MAX_LENGTH]{}; UINT32 appUserModelIdSize{ ARRAYSIZE(appUserModelId) }; - THROW_IF_WIN32_ERROR(GetCurrentApplicationUserModelId(&appUserModelIdSize, appUserModelId)); + THROW_IF_WIN32_ERROR(::GetCurrentApplicationUserModelId(&appUserModelIdSize, appUserModelId)); return appUserModelId; } diff --git a/dev/DynamicDependencyDataStore/DynamicDependency.DataStore/winmain.cpp b/dev/DynamicDependencyDataStore/DynamicDependency.DataStore/winmain.cpp index c30697bd7c..e5f3b3a7b6 100644 --- a/dev/DynamicDependencyDataStore/DynamicDependency.DataStore/winmain.cpp +++ b/dev/DynamicDependencyDataStore/DynamicDependency.DataStore/winmain.cpp @@ -41,7 +41,7 @@ struct __declspec(uuid(PR_DYNDEP_DATASTORE_CLSID_STRING)) DynamicDependencyDataS WCHAR fullName[PACKAGE_FULL_NAME_MAX_LENGTH + 1]{}; UINT32 fullNameLength = ARRAYSIZE(fullName); - RETURN_IF_FAILED(GetCurrentPackageFullName(&fullNameLength, fullName)); + RETURN_IF_FAILED(::GetCurrentPackageFullName(&fullNameLength, fullName)); auto fullNameCoTaskMem = wil::make_cotaskmem_string_nothrow(fullName); RETURN_IF_NULL_ALLOC(fullNameCoTaskMem); diff --git a/dev/DynamicDependencyLifetimeManager/DynamicDependencyLifetimeManager/winmain.cpp b/dev/DynamicDependencyLifetimeManager/DynamicDependencyLifetimeManager/winmain.cpp index 93d49f8b39..0c56221b77 100644 --- a/dev/DynamicDependencyLifetimeManager/DynamicDependencyLifetimeManager/winmain.cpp +++ b/dev/DynamicDependencyLifetimeManager/DynamicDependencyLifetimeManager/winmain.cpp @@ -38,7 +38,7 @@ struct __declspec(uuid(PR_DYNDEP_LIFETIMEMANAGER_CLSID_STRING)) DynamicDependenc WCHAR fullName[PACKAGE_FULL_NAME_MAX_LENGTH + 1]{}; UINT32 fullNameLength = ARRAYSIZE(fullName); - RETURN_IF_FAILED(GetCurrentPackageFullName(&fullNameLength, fullName)); + RETURN_IF_FAILED(::GetCurrentPackageFullName(&fullNameLength, fullName)); auto fullNameCoTaskMem = wil::make_cotaskmem_string_nothrow(fullName); RETURN_IF_NULL_ALLOC(fullNameCoTaskMem); diff --git a/dev/Kozani/KozaniHostRuntime/main.cpp b/dev/Kozani/KozaniHostRuntime/main.cpp index 5f76ad67e4..7b14239271 100644 --- a/dev/Kozani/KozaniHostRuntime/main.cpp +++ b/dev/Kozani/KozaniHostRuntime/main.cpp @@ -119,7 +119,7 @@ void LogArgs(int argc, PWSTR* argv) // com.microsoft.kozani.localvariant.remoteapp. // and the app extension Id is the package-relative application identifier (PRAID) of the LVP app being activated. // : we replace the '_' character in the package family name with '-' as '_' is not allowed in the app extension name. -// +// // For example: // // Date: Thu, 28 Dec 2023 00:41:40 -0800 Subject: [PATCH 10/22] Tweaked to be smarter about Windows.Storage.ApplicationData's weird limitations --- dev/ApplicationData/M.W.S.ApplicationData.cpp | 28 ++++++++++++++++++- dev/ApplicationData/pch.h | 3 +- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index a19c04e012..4e80ba604a 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -8,6 +8,8 @@ #include "M.W.S.ApplicationDataContainer.h" +#include + #include #include "ApplicationDataTelemetry.h" @@ -27,17 +29,41 @@ namespace winrt::Microsoft::Windows::Storage::implementation winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetDefault() { const auto packageFamilyName{ ::AppModel::Identity::GetCurrentPackageFamilyName() }; - auto applicationData{ winrt::Windows::Storage::ApplicationData::Current() }; + winrt::Windows::Storage::ApplicationData applicationData{ nullptr }; + if (wil::get_token_is_app_container()) + { + applicationData = winrt::Windows::Storage::ApplicationData::Current(); + } + else + { + applicationData = winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName); + } return winrt::make(applicationData, packageFamilyName); } winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUser(winrt::Windows::System::User user) { + if (!user) + { + return GetDefault(); + } const auto packageFamilyName{ ::AppModel::Identity::GetCurrentPackageFamilyName() }; auto applicationData{ winrt::Windows::Storage::ApplicationData::GetForUserAsync(user).get() }; return winrt::make(applicationData, packageFamilyName); } winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForPackageFamily(hstring const& packageFamilyName) { + if (wil::get_token_is_app_container()) + { + // ApplicationDataManager.CreateForPackageFamily requires the caller is not in an AppContainer + // But if you ask for your own package family name it's equivalent to GetDefault() + const auto currentPackageFamilyName{ ::AppModel::Identity::GetCurrentPackageFamilyName() }; + if (CompareStringOrdinal(packageFamilyName.c_str(), -1, currentPackageFamilyName.c_str(), -1, TRUE) == CSTR_EQUAL) + { + return GetDefault(); + } + + // Let's fall through and let CreateForPackageFamily()'s error handling report the problem + } auto applicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; return winrt::make(applicationData, packageFamilyName); } diff --git a/dev/ApplicationData/pch.h b/dev/ApplicationData/pch.h index ea70ffe5bb..fa56a732f0 100644 --- a/dev/ApplicationData/pch.h +++ b/dev/ApplicationData/pch.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #pragma once @@ -16,6 +16,7 @@ #include #include #include +#include #include #include From a4030260f87fb18ff82221685f1f208a154a5449 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Fri, 29 Dec 2023 02:11:07 -0800 Subject: [PATCH 11/22] Fixed ApplicationData.MachinePath to use the right path. Bumped WIL to 1.0.231216.1 (to get access to wil::reg APIs) --- dev/ApplicationData/M.W.S.ApplicationData.cpp | 10 +++++++--- dev/ApplicationData/pch.h | 1 + dev/Common/Security.IntegrityLevel.h | 4 ++-- dev/Common/Security.User.h | 4 ++-- dev/DeploymentAgent/packages.config | 2 +- dev/Kozani/KozaniAppGraph/packages.config | 2 +- dev/Kozani/KozaniHostRuntime/packages.config | 2 +- dev/Kozani/KozaniManager/main.cpp | 2 +- dev/Kozani/KozaniManager/packages.config | 2 +- dev/Kozani/KozaniManagerRuntime/packages.config | 2 +- dev/Kozani/KozaniPackage/packages.config | 2 +- dev/Kozani/KozaniRemoteManager/KozaniDvcServer.cpp | 4 ++-- dev/Kozani/KozaniRemoteManager/packages.config | 2 +- dev/Kozani/KozaniRemoteManagerLauncher/packages.config | 2 +- dev/Kozani/KozaniSendToLocal/packages.config | 2 +- dev/Kozani/KozaniSendToRemote/packages.config | 2 +- dev/Kozani/KozaniSettings/packages.config | 2 +- dev/Kozani/MakeMSIX/packages.config | 2 +- dev/MRTCore/mrt/Core/src/packages.config | 2 +- dev/MRTCore/mrt/mrm/UnitTests/packages.config | 2 +- dev/MRTCore/mrt/mrm/mrmex/packages.config | 2 +- dev/MRTCore/mrt/mrm/mrmmin/packages.config | 2 +- .../packages.config | 4 ++-- .../PushNotificationsLongRunningTask/packages.config | 2 +- dev/RestartAgent/packages.config | 2 +- dev/WindowsAppRuntime_BootstrapDLL/packages.config | 2 +- dev/WindowsAppRuntime_DLL/packages.config | 2 +- dev/WindowsAppRuntime_DLL/pch.h | 1 + eng/Version.Dependencies.xml | 2 +- installer/dev/packages.config | 2 +- .../test/InstallerFunctionalTests/packages.config | 2 +- test/AppLifecycle/packages.config | 2 +- test/AppNotificationBuilderTests/packages.config | 2 +- test/AppNotificationTests/packages.config | 2 +- test/Common/packages.config | 2 +- test/Deployment/API/packages.config | 2 +- .../packages.config | 2 +- .../packages.config | 2 +- .../packages.config | 2 +- .../packages.config | 2 +- .../packages.config | 4 ++-- .../packages.config | 4 ++-- .../packages.config | 4 ++-- .../packages.config | 4 ++-- .../data/Framework.Widgets/packages.config | 2 +- test/EnvironmentManagerTests/packages.config | 2 +- test/Kozani/KozaniAppGraphTests/packages.config | 2 +- test/Kozani/KozaniHostRuntimeTests/packages.config | 2 +- test/Kozani/KozaniManagerRuntimeTests/packages.config | 2 +- test/Kozani/KozaniManagerTests/packages.config | 2 +- test/Kozani/KozaniPackageTests/packages.config | 2 +- test/Kozani/KozaniRemoteManagerTests/packages.config | 2 +- test/Kozani/KozaniSendToLocalTests/packages.config | 2 +- test/Kozani/KozaniSendToRemoteTests/packages.config | 2 +- test/Kozani/KozaniSettingsTests/packages.config | 2 +- test/Kozani/MakeMSIXTests/packages.config | 2 +- test/LRPTests/packages.config | 2 +- test/PackageManager/API/packages.config | 2 +- test/PowerNotifications/packages.config | 2 +- test/PushNotificationTests/packages.config | 2 +- test/TestApps/AccessControlTestApp/packages.config | 2 +- test/TestApps/AppLifecycleTestApp/packages.config | 2 +- test/TestApps/ManualTestApp/packages.config | 2 +- test/TestApps/PushNotificationsDemoApp/packages.config | 2 +- test/TestApps/PushNotificationsTestApp/packages.config | 2 +- .../TestApps/ToastNotificationsDemoApp/packages.config | 2 +- .../TestApps/ToastNotificationsTestApp/packages.config | 2 +- test/VersionInfo/packages.config | 2 +- .../dev.cpp.dll.winrt-client-server/packages.config | 2 +- .../dev.cpp.dll.winrt-client/packages.config | 2 +- .../PurojekutoTenpuret/packages.config | 2 +- .../dev.cpp.exe.com-oopserver-main/packages.config | 2 +- .../dev.cpp.exe.console-winrt-client/packages.config | 2 +- .../dev.cpp.exe.winmain-winrt-client/packages.config | 2 +- .../ProjectTemplates/test.cpp.dll.taef/packages.config | 2 +- 75 files changed, 89 insertions(+), 83 deletions(-) diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 4e80ba604a..0dae228ed2 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -90,10 +90,14 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::MachinePath() { - wil::unique_cotaskmem_string programData; - THROW_IF_FAILED(::SHGetKnownFolderPath(FOLDERID_ProgramData, 0, nullptr, wil::out_param(programData))); - std::filesystem::path path{ programData.get() }; + // Path = ...apprepository...\ApplicationData\...pkgfamilyname...\Machine + // This is typically %ProgramData%\Microsoft\Windows\AppRepository\ApplicationData\...pkgfamilyname...\Machine + PCWSTR c_path{ L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Appx" }; + PCWSTR c_valueName{ L"PackageRepositoryRoot" }; + std::filesystem::path appRepository{ wil::reg::get_value_string(HKEY_LOCAL_MACHINE, c_path, c_valueName) }; + auto path{ appRepository / L"ApplicationData" }; path /= m_packageFamilyName.c_str(); + path /= "Machine"; return hstring{ path.c_str() }; } hstring ApplicationData::RoamingPath() diff --git a/dev/ApplicationData/pch.h b/dev/ApplicationData/pch.h index fa56a732f0..ec56d476e4 100644 --- a/dev/ApplicationData/pch.h +++ b/dev/ApplicationData/pch.h @@ -14,6 +14,7 @@ #include #include +#include #include #include #include diff --git a/dev/Common/Security.IntegrityLevel.h b/dev/Common/Security.IntegrityLevel.h index 90ee0759e0..43b4a4db99 100644 --- a/dev/Common/Security.IntegrityLevel.h +++ b/dev/Common/Security.IntegrityLevel.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #ifndef __SECURITY_INTEGRITYLEVEL_H @@ -8,7 +8,7 @@ namespace Security::IntegrityLevel { inline DWORD GetIntegrityLevel(HANDLE token = nullptr) { - wistd::unique_ptr tokenMandatoryLabel{ + auto tokenMandatoryLabel{ wil::get_token_information_failfast( !token ? GetCurrentThreadEffectiveToken() : token) }; return *GetSidSubAuthority((*tokenMandatoryLabel).Label.Sid, diff --git a/dev/Common/Security.User.h b/dev/Common/Security.User.h index 87e7d0d8c2..b3e11b0588 100644 --- a/dev/Common/Security.User.h +++ b/dev/Common/Security.User.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #ifndef __SECURITY_USER_H @@ -13,7 +13,7 @@ inline bool IsLocalSystem(HANDLE token = nullptr) DWORD localSystemSidBufferSize{ ARRAYSIZE(localSystemSidBuffer) }; THROW_IF_WIN32_BOOL_FALSE(CreateWellKnownSid(WinLocalSystemSid, nullptr, localSystemSid, &localSystemSidBufferSize)); - wistd::unique_ptr user{ wil::get_token_information(!token ? GetCurrentThreadEffectiveToken() : token) }; + const auto user{ wil::get_token_information(!token ? GetCurrentThreadEffectiveToken() : token) }; PSID userSid{ user->User.Sid }; return !!EqualSid(userSid, localSystemSid); diff --git a/dev/DeploymentAgent/packages.config b/dev/DeploymentAgent/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/dev/DeploymentAgent/packages.config +++ b/dev/DeploymentAgent/packages.config @@ -1,5 +1,5 @@  - + diff --git a/dev/Kozani/KozaniAppGraph/packages.config b/dev/Kozani/KozaniAppGraph/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniAppGraph/packages.config +++ b/dev/Kozani/KozaniAppGraph/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/KozaniHostRuntime/packages.config b/dev/Kozani/KozaniHostRuntime/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniHostRuntime/packages.config +++ b/dev/Kozani/KozaniHostRuntime/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/KozaniManager/main.cpp b/dev/Kozani/KozaniManager/main.cpp index 60174a6b13..6bcfff6e53 100644 --- a/dev/Kozani/KozaniManager/main.cpp +++ b/dev/Kozani/KozaniManager/main.cpp @@ -93,7 +93,7 @@ struct __declspec(uuid(PR_KOZANIMANAGER_CLSID_STRING)) KozaniManagerImpl WrlFina DWORD associatedLocalProcessId, _In_opt_::IInspectable* activatedEventArgs, _In_opt_ IKozaniStatusCallback* statusCallback, - _In_opt_ PCWSTR additionalSettingsFilePath) noexcept try + _In_opt_ PCWSTR /*additionalSettingsFilePath*/ ) noexcept try { RETURN_HR_IF_NULL(E_INVALIDARG, appUserModelId); RETURN_HR_IF_NULL(E_INVALIDARG, connectionRdpFilePath); diff --git a/dev/Kozani/KozaniManager/packages.config b/dev/Kozani/KozaniManager/packages.config index 8d63d7f888..e173a29618 100644 --- a/dev/Kozani/KozaniManager/packages.config +++ b/dev/Kozani/KozaniManager/packages.config @@ -4,6 +4,6 @@ - + diff --git a/dev/Kozani/KozaniManagerRuntime/packages.config b/dev/Kozani/KozaniManagerRuntime/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniManagerRuntime/packages.config +++ b/dev/Kozani/KozaniManagerRuntime/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/KozaniPackage/packages.config b/dev/Kozani/KozaniPackage/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniPackage/packages.config +++ b/dev/Kozani/KozaniPackage/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/KozaniRemoteManager/KozaniDvcServer.cpp b/dev/Kozani/KozaniRemoteManager/KozaniDvcServer.cpp index 36af192dac..6c988847db 100644 --- a/dev/Kozani/KozaniRemoteManager/KozaniDvcServer.cpp +++ b/dev/Kozani/KozaniRemoteManager/KozaniDvcServer.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #pragma once @@ -750,7 +750,7 @@ namespace Microsoft::Kozani::KozaniRemoteManager } m_errorFromDvcListener = errorCode; - LOG_HR_MSG(errorCode, "DVC listener thread exiting. Error message: %s", erroMessage); + LOG_HR_MSG(errorCode, "DVC listener thread exiting. Error message: %hs", erroMessage); m_dvcThreadExit.SetEvent(); diff --git a/dev/Kozani/KozaniRemoteManager/packages.config b/dev/Kozani/KozaniRemoteManager/packages.config index 8d63d7f888..e173a29618 100644 --- a/dev/Kozani/KozaniRemoteManager/packages.config +++ b/dev/Kozani/KozaniRemoteManager/packages.config @@ -4,6 +4,6 @@ - + diff --git a/dev/Kozani/KozaniRemoteManagerLauncher/packages.config b/dev/Kozani/KozaniRemoteManagerLauncher/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniRemoteManagerLauncher/packages.config +++ b/dev/Kozani/KozaniRemoteManagerLauncher/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/KozaniSendToLocal/packages.config b/dev/Kozani/KozaniSendToLocal/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniSendToLocal/packages.config +++ b/dev/Kozani/KozaniSendToLocal/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/KozaniSendToRemote/packages.config b/dev/Kozani/KozaniSendToRemote/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniSendToRemote/packages.config +++ b/dev/Kozani/KozaniSendToRemote/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/KozaniSettings/packages.config b/dev/Kozani/KozaniSettings/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/KozaniSettings/packages.config +++ b/dev/Kozani/KozaniSettings/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/Kozani/MakeMSIX/packages.config b/dev/Kozani/MakeMSIX/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/Kozani/MakeMSIX/packages.config +++ b/dev/Kozani/MakeMSIX/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/MRTCore/mrt/Core/src/packages.config b/dev/MRTCore/mrt/Core/src/packages.config index e9fecf8c0b..1680d22b22 100644 --- a/dev/MRTCore/mrt/Core/src/packages.config +++ b/dev/MRTCore/mrt/Core/src/packages.config @@ -3,5 +3,5 @@ - + diff --git a/dev/MRTCore/mrt/mrm/UnitTests/packages.config b/dev/MRTCore/mrt/mrm/UnitTests/packages.config index 3a3c1cd7e9..eaa80add0d 100644 --- a/dev/MRTCore/mrt/mrm/UnitTests/packages.config +++ b/dev/MRTCore/mrt/mrm/UnitTests/packages.config @@ -1,5 +1,5 @@  - + diff --git a/dev/MRTCore/mrt/mrm/mrmex/packages.config b/dev/MRTCore/mrt/mrm/mrmex/packages.config index a63e6c97b3..de36c73465 100644 --- a/dev/MRTCore/mrt/mrm/mrmex/packages.config +++ b/dev/MRTCore/mrt/mrm/mrmex/packages.config @@ -1,4 +1,4 @@  - + diff --git a/dev/MRTCore/mrt/mrm/mrmmin/packages.config b/dev/MRTCore/mrt/mrm/mrmmin/packages.config index a63e6c97b3..de36c73465 100644 --- a/dev/MRTCore/mrt/mrm/mrmmin/packages.config +++ b/dev/MRTCore/mrt/mrm/mrmmin/packages.config @@ -1,4 +1,4 @@  - + diff --git a/dev/PushNotifications/PushNotificationsLongRunningTask.StartupTask/packages.config b/dev/PushNotifications/PushNotificationsLongRunningTask.StartupTask/packages.config index d7178814bc..f0c66966db 100644 --- a/dev/PushNotifications/PushNotificationsLongRunningTask.StartupTask/packages.config +++ b/dev/PushNotifications/PushNotificationsLongRunningTask.StartupTask/packages.config @@ -1,7 +1,7 @@  - + - \ No newline at end of file + diff --git a/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config b/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config +++ b/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/RestartAgent/packages.config b/dev/RestartAgent/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/dev/RestartAgent/packages.config +++ b/dev/RestartAgent/packages.config @@ -1,5 +1,5 @@  - + diff --git a/dev/WindowsAppRuntime_BootstrapDLL/packages.config b/dev/WindowsAppRuntime_BootstrapDLL/packages.config index e9fecf8c0b..1680d22b22 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/packages.config +++ b/dev/WindowsAppRuntime_BootstrapDLL/packages.config @@ -3,5 +3,5 @@ - + diff --git a/dev/WindowsAppRuntime_DLL/packages.config b/dev/WindowsAppRuntime_DLL/packages.config index cd05427e9c..c6c2f60267 100644 --- a/dev/WindowsAppRuntime_DLL/packages.config +++ b/dev/WindowsAppRuntime_DLL/packages.config @@ -4,5 +4,5 @@ - + diff --git a/dev/WindowsAppRuntime_DLL/pch.h b/dev/WindowsAppRuntime_DLL/pch.h index ec070ce0f0..350c4d8350 100644 --- a/dev/WindowsAppRuntime_DLL/pch.h +++ b/dev/WindowsAppRuntime_DLL/pch.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include diff --git a/eng/Version.Dependencies.xml b/eng/Version.Dependencies.xml index fba4803c9f..d902ca483a 100644 --- a/eng/Version.Dependencies.xml +++ b/eng/Version.Dependencies.xml @@ -32,6 +32,6 @@ - + diff --git a/installer/dev/packages.config b/installer/dev/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/installer/dev/packages.config +++ b/installer/dev/packages.config @@ -1,5 +1,5 @@  - + diff --git a/installer/test/InstallerFunctionalTests/packages.config b/installer/test/InstallerFunctionalTests/packages.config index 1117ac430f..a79b1210ca 100644 --- a/installer/test/InstallerFunctionalTests/packages.config +++ b/installer/test/InstallerFunctionalTests/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/AppLifecycle/packages.config b/test/AppLifecycle/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/AppLifecycle/packages.config +++ b/test/AppLifecycle/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/AppNotificationBuilderTests/packages.config b/test/AppNotificationBuilderTests/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/AppNotificationBuilderTests/packages.config +++ b/test/AppNotificationBuilderTests/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/AppNotificationTests/packages.config b/test/AppNotificationTests/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/AppNotificationTests/packages.config +++ b/test/AppNotificationTests/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/Common/packages.config b/test/Common/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/Common/packages.config +++ b/test/Common/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/Deployment/API/packages.config b/test/Deployment/API/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/Deployment/API/packages.config +++ b/test/Deployment/API/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Default/packages.config b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Default/packages.config index 3d9798ef5e..de36c73465 100644 --- a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Default/packages.config +++ b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Default/packages.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Default/packages.config b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Default/packages.config index 3d9798ef5e..de36c73465 100644 --- a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Default/packages.config +++ b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Default/packages.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Defined/packages.config b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Defined/packages.config index 3d9798ef5e..de36c73465 100644 --- a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Defined/packages.config +++ b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_Defined/packages.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_None/packages.config b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_None/packages.config index 3d9798ef5e..de36c73465 100644 --- a/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_None/packages.config +++ b/test/DynamicDependency/Test_BootstrapAutoInitialize/CPP/Test_BootstrapAutoInitialize_CPP_Options_None/packages.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/test/DynamicDependency/data/Framework.Widgets/packages.config b/test/DynamicDependency/data/Framework.Widgets/packages.config index 9ba3aa91dd..de426df9bc 100644 --- a/test/DynamicDependency/data/Framework.Widgets/packages.config +++ b/test/DynamicDependency/data/Framework.Widgets/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/EnvironmentManagerTests/packages.config b/test/EnvironmentManagerTests/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/EnvironmentManagerTests/packages.config +++ b/test/EnvironmentManagerTests/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/Kozani/KozaniAppGraphTests/packages.config b/test/Kozani/KozaniAppGraphTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniAppGraphTests/packages.config +++ b/test/Kozani/KozaniAppGraphTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniHostRuntimeTests/packages.config b/test/Kozani/KozaniHostRuntimeTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniHostRuntimeTests/packages.config +++ b/test/Kozani/KozaniHostRuntimeTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniManagerRuntimeTests/packages.config b/test/Kozani/KozaniManagerRuntimeTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniManagerRuntimeTests/packages.config +++ b/test/Kozani/KozaniManagerRuntimeTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniManagerTests/packages.config b/test/Kozani/KozaniManagerTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniManagerTests/packages.config +++ b/test/Kozani/KozaniManagerTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniPackageTests/packages.config b/test/Kozani/KozaniPackageTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniPackageTests/packages.config +++ b/test/Kozani/KozaniPackageTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniRemoteManagerTests/packages.config b/test/Kozani/KozaniRemoteManagerTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniRemoteManagerTests/packages.config +++ b/test/Kozani/KozaniRemoteManagerTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniSendToLocalTests/packages.config b/test/Kozani/KozaniSendToLocalTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniSendToLocalTests/packages.config +++ b/test/Kozani/KozaniSendToLocalTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniSendToRemoteTests/packages.config b/test/Kozani/KozaniSendToRemoteTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniSendToRemoteTests/packages.config +++ b/test/Kozani/KozaniSendToRemoteTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/KozaniSettingsTests/packages.config b/test/Kozani/KozaniSettingsTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/KozaniSettingsTests/packages.config +++ b/test/Kozani/KozaniSettingsTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/Kozani/MakeMSIXTests/packages.config b/test/Kozani/MakeMSIXTests/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/Kozani/MakeMSIXTests/packages.config +++ b/test/Kozani/MakeMSIXTests/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/LRPTests/packages.config b/test/LRPTests/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/LRPTests/packages.config +++ b/test/LRPTests/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/PackageManager/API/packages.config b/test/PackageManager/API/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/test/PackageManager/API/packages.config +++ b/test/PackageManager/API/packages.config @@ -5,5 +5,5 @@ - + diff --git a/test/PowerNotifications/packages.config b/test/PowerNotifications/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/PowerNotifications/packages.config +++ b/test/PowerNotifications/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/PushNotificationTests/packages.config b/test/PushNotificationTests/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/PushNotificationTests/packages.config +++ b/test/PushNotificationTests/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/TestApps/AccessControlTestApp/packages.config b/test/TestApps/AccessControlTestApp/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/TestApps/AccessControlTestApp/packages.config +++ b/test/TestApps/AccessControlTestApp/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/TestApps/AppLifecycleTestApp/packages.config b/test/TestApps/AppLifecycleTestApp/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/TestApps/AppLifecycleTestApp/packages.config +++ b/test/TestApps/AppLifecycleTestApp/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/TestApps/ManualTestApp/packages.config b/test/TestApps/ManualTestApp/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/TestApps/ManualTestApp/packages.config +++ b/test/TestApps/ManualTestApp/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/TestApps/PushNotificationsDemoApp/packages.config b/test/TestApps/PushNotificationsDemoApp/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/TestApps/PushNotificationsDemoApp/packages.config +++ b/test/TestApps/PushNotificationsDemoApp/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/TestApps/PushNotificationsTestApp/packages.config b/test/TestApps/PushNotificationsTestApp/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/TestApps/PushNotificationsTestApp/packages.config +++ b/test/TestApps/PushNotificationsTestApp/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/TestApps/ToastNotificationsDemoApp/packages.config b/test/TestApps/ToastNotificationsDemoApp/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/TestApps/ToastNotificationsDemoApp/packages.config +++ b/test/TestApps/ToastNotificationsDemoApp/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/TestApps/ToastNotificationsTestApp/packages.config b/test/TestApps/ToastNotificationsTestApp/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/TestApps/ToastNotificationsTestApp/packages.config +++ b/test/TestApps/ToastNotificationsTestApp/packages.config @@ -2,5 +2,5 @@ - + diff --git a/test/VersionInfo/packages.config b/test/VersionInfo/packages.config index 1117ac430f..a79b1210ca 100644 --- a/test/VersionInfo/packages.config +++ b/test/VersionInfo/packages.config @@ -2,5 +2,5 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config b/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config index cd05427e9c..c6c2f60267 100644 --- a/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config +++ b/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config @@ -4,5 +4,5 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config b/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config index cd05427e9c..c6c2f60267 100644 --- a/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config +++ b/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config @@ -4,5 +4,5 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config b/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config index cd05427e9c..c6c2f60267 100644 --- a/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config @@ -4,5 +4,5 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config b/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config index cd05427e9c..c6c2f60267 100644 --- a/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config @@ -4,5 +4,5 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config b/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config index cd05427e9c..c6c2f60267 100644 --- a/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config @@ -4,5 +4,5 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config b/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config index cd05427e9c..c6c2f60267 100644 --- a/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config @@ -4,5 +4,5 @@ - + diff --git a/tools/ProjectTemplates/test.cpp.dll.taef/packages.config b/tools/ProjectTemplates/test.cpp.dll.taef/packages.config index ecebfdd18e..550cd4a61f 100644 --- a/tools/ProjectTemplates/test.cpp.dll.taef/packages.config +++ b/tools/ProjectTemplates/test.cpp.dll.taef/packages.config @@ -5,5 +5,5 @@ - + From 6c64f0499eac65c247e90eaac18a1233d2ff2961 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Fri, 29 Dec 2023 15:44:44 -0800 Subject: [PATCH 12/22] Implemented IsMachinePathSupported() --- dev/ApplicationData/M.W.S.ApplicationData.cpp | 30 ++++++++++--------- dev/ApplicationData/M.W.S.ApplicationData.h | 5 +++- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 0dae228ed2..1cbc8ccf5b 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -74,11 +74,9 @@ namespace winrt::Microsoft::Windows::Storage::implementation } bool ApplicationData::IsMachinePathSupported() { -#if defined(TODO_FrameworkUdk__ApplicationData_MachinePathIsSupported) - bool isSupported{}; - THROW_IF_FAILED(ApplicationData_IsMachinePathSupported(m_packageFamilyName.c_str(), isSupported)); -#endif - return false; + const auto path{ _MachinePath(m_packageFamilyName) }; + const std::filesystem::directory_entry directoryEntry{ path }; + return directoryEntry.is_directory(); } hstring ApplicationData::LocalCachePath() { @@ -90,15 +88,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::MachinePath() { - // Path = ...apprepository...\ApplicationData\...pkgfamilyname...\Machine - // This is typically %ProgramData%\Microsoft\Windows\AppRepository\ApplicationData\...pkgfamilyname...\Machine - PCWSTR c_path{ L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Appx" }; - PCWSTR c_valueName{ L"PackageRepositoryRoot" }; - std::filesystem::path appRepository{ wil::reg::get_value_string(HKEY_LOCAL_MACHINE, c_path, c_valueName) }; - auto path{ appRepository / L"ApplicationData" }; - path /= m_packageFamilyName.c_str(); - path /= "Machine"; - return hstring{ path.c_str() }; + return winrt::hstring{ _MachinePath(m_packageFamilyName).c_str()}; } hstring ApplicationData::RoamingPath() { @@ -187,4 +177,16 @@ namespace winrt::Microsoft::Windows::Storage::implementation { return m_applicationData.GetPublisherCacheFolder(folderName); } + std::filesystem::path ApplicationData::_MachinePath(hstring const& packageFamilyName) + { + // Path = ...apprepository...\ApplicationData\...pkgfamilyname...\Machine + // This is typically %ProgramData%\Microsoft\Windows\AppRepository\ApplicationData\...pkgfamilyname...\Machine + PCWSTR c_path{ L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Appx" }; + PCWSTR c_valueName{ L"PackageRepositoryRoot" }; + std::filesystem::path appRepository{ wil::reg::get_value_string(HKEY_LOCAL_MACHINE, c_path, c_valueName) }; + auto path{ appRepository / L"ApplicationData" }; + path /= packageFamilyName.c_str(); + path /= "Machine"; + return path; + } } diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index 06ce7799b6..596eb35cc9 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #pragma once @@ -39,6 +39,9 @@ namespace winrt::Microsoft::Windows::Storage::implementation hstring GetPublisherCachePath(hstring const& folderName); winrt::Windows::Storage::StorageFolder GetPublisherCacheFolder(hstring const& folderName); + private: + static std::filesystem::path _MachinePath(hstring const& packageFamilyName); + private: winrt::Windows::Storage::ApplicationData m_applicationData; winrt::hstring m_packageFamilyName; From b1d387dde26d1be2480ddeb640652ba2df92fcd2 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sat, 30 Dec 2023 03:00:36 -0800 Subject: [PATCH 13/22] Added tests (mostly) --- WindowsAppRuntime.sln | 27 ++ build/NuSpecs/AppxManifest.xml | 4 + dev/ApplicationData/M.W.S.ApplicationData.cpp | 185 ++++++- dev/ApplicationData/M.W.S.ApplicationData.h | 1 + test/ApplicationData/ApplicationDataTests.cpp | 450 ++++++++++++++++++ .../ApplicationDataTests.vcxproj | 164 +++++++ .../ApplicationDataTests.vcxproj.filters | 33 ++ test/ApplicationData/Test.testdef | 11 + test/ApplicationData/packages.config | 9 + test/ApplicationData/pch.cpp | 6 + test/ApplicationData/pch.h | 29 ++ .../appxmanifest.xml | 7 + 12 files changed, 913 insertions(+), 13 deletions(-) create mode 100644 test/ApplicationData/ApplicationDataTests.cpp create mode 100644 test/ApplicationData/ApplicationDataTests.vcxproj create mode 100644 test/ApplicationData/ApplicationDataTests.vcxproj.filters create mode 100644 test/ApplicationData/Test.testdef create mode 100644 test/ApplicationData/packages.config create mode 100644 test/ApplicationData/pch.cpp create mode 100644 test/ApplicationData/pch.h diff --git a/WindowsAppRuntime.sln b/WindowsAppRuntime.sln index 9da2dd368d..677fc6491b 100644 --- a/WindowsAppRuntime.sln +++ b/WindowsAppRuntime.sln @@ -709,6 +709,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationData", "Applicat EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ApplicationData", "dev\ApplicationData\ApplicationData.vcxitems", "{7CF52890-56FA-47E2-84FB-68EE274324B6}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationData", "ApplicationData", "{27C67ECD-0C3F-410A-AEF7-83AA257787E8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ApplicationDataTests", "test\ApplicationData\ApplicationDataTests.vcxproj", "{F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}" + ProjectSection(ProjectDependencies) = postProject + {9C1A6C58-52D6-4514-9120-5C339C5DF4BE} = {9C1A6C58-52D6-4514-9120-5C339C5DF4BE} + {B71E818A-882E-456A-87E5-4DE4A6602B99} = {B71E818A-882E-456A-87E5-4DE4A6602B99} + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -2385,6 +2394,22 @@ Global {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x64.Build.0 = Release|x64 {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x86.ActiveCfg = Release|Win32 {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x86.Build.0 = Release|Win32 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|Any CPU.Build.0 = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|ARM64.Build.0 = Debug|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x64.ActiveCfg = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x64.Build.0 = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x86.ActiveCfg = Debug|Win32 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x86.Build.0 = Debug|Win32 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|Any CPU.ActiveCfg = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|Any CPU.Build.0 = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|ARM64.ActiveCfg = Release|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|ARM64.Build.0 = Release|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x64.ActiveCfg = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x64.Build.0 = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x86.ActiveCfg = Release|Win32 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2596,6 +2621,8 @@ Global {B5798CEB-4E60-4D2D-B456-7C406B5F5B67} = {48948EF9-8B91-4F7A-98AD-0F8FA3EFAA38} {E3023618-8435-444B-988E-3F898BD17724} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} {7CF52890-56FA-47E2-84FB-68EE274324B6} = {E3023618-8435-444B-988E-3F898BD17724} + {27C67ECD-0C3F-410A-AEF7-83AA257787E8} = {8630F7AA-2969-4DC9-8700-9B468C1DC21D} + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3} = {27C67ECD-0C3F-410A-AEF7-83AA257787E8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4B3D7591-CFEC-4762-9A07-ABE99938FB77} diff --git a/build/NuSpecs/AppxManifest.xml b/build/NuSpecs/AppxManifest.xml index a4c68722d5..21411a498e 100644 --- a/build/NuSpecs/AppxManifest.xml +++ b/build/NuSpecs/AppxManifest.xml @@ -94,6 +94,10 @@ + + + + diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 1cbc8ccf5b..7e0cdcc4b1 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -64,8 +64,33 @@ namespace winrt::Microsoft::Windows::Storage::implementation // Let's fall through and let CreateForPackageFamily()'s error handling report the problem } - auto applicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; - return winrt::make(applicationData, packageFamilyName); + + try + { + auto applicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + return winrt::make(applicationData, packageFamilyName); + } + catch (winrt::hresult_error& e) + { + // CreateForPackageFamily() fails for Framework packages with HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + // But we succeed (the return object is just limited in function) + if (e.code() == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) + { + UINT32 count{}; + UINT32 bufferLength{}; + UINT32 packageProperties{}; + const auto rc{ ::FindPackagesByPackageFamily(packageFamilyName.c_str(), PACKAGE_FILTER_DIRECT, &count, nullptr, &bufferLength, nullptr, &packageProperties) }; + if ((rc == ERROR_INSUFFICIENT_BUFFER) && (count > 0)) + { + // The package family has package(s) registered for the user with at least 1 Framework package + // (and a package family can't have Framework and not-Framework packages in the same package family) + return winrt::make(nullptr, packageFamilyName); + } + } + + // Nope! Not a framework. We have an actual error + throw; + } } winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUnpackaged(hstring const& publisher, hstring const& name) { @@ -75,78 +100,164 @@ namespace winrt::Microsoft::Windows::Storage::implementation bool ApplicationData::IsMachinePathSupported() { const auto path{ _MachinePath(m_packageFamilyName) }; - const std::filesystem::directory_entry directoryEntry{ path }; - return directoryEntry.is_directory(); + return _PathExists(path); } hstring ApplicationData::LocalCachePath() { + if (!m_applicationData) + { + return winrt::hstring{}; + } return m_applicationData.LocalCacheFolder().Path(); } hstring ApplicationData::LocalPath() { + if (!m_applicationData) + { + return winrt::hstring{}; + } return m_applicationData.LocalFolder().Path(); } hstring ApplicationData::MachinePath() { - return winrt::hstring{ _MachinePath(m_packageFamilyName).c_str()}; + const auto path{ _MachinePath(m_packageFamilyName) }; + winrt::hstring machinePath; + if (_PathExists(path)) + { + machinePath = path.c_str(); + } + return machinePath; } hstring ApplicationData::RoamingPath() { + if (!m_applicationData) + { + return winrt::hstring{}; + } return m_applicationData.RoamingFolder().Path(); } hstring ApplicationData::SharedLocalPath() { - return m_applicationData.SharedLocalFolder().Path(); + if (!m_applicationData) + { + return winrt::hstring{}; + } + + // SharedLocalFolder is only available if the device has the appropriate group policy. If the group policy + // is not enabled, the device administrator must enable it. From Local Group Policy Editor, navigate to + // Computer Configuration\Administrative Templates\Windows Components\App Package Deployment, + // then change the setting "Allow a Windows app to share application data between users" to "Enabled." + // + // After the group policy is enabled, SharedLocalFolder can be accessed. + // + // @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.sharedlocalfolder + + auto sharedLocalFolder{ m_applicationData.SharedLocalFolder() }; + winrt::hstring path; + if (sharedLocalFolder) + { + path = sharedLocalFolder.Path(); + } + return path; } hstring ApplicationData::TemporaryPath() { + if (!m_applicationData) + { + return winrt::hstring{}; + } return m_applicationData.TemporaryFolder().Path(); } winrt::Windows::Storage::StorageFolder ApplicationData::LocalCacheFolder() { + if (!m_applicationData) + { + return nullptr; + } return m_applicationData.LocalCacheFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::LocalFolder() { + if (!m_applicationData) + { + return nullptr; + } return m_applicationData.LocalFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::MachineFolder() { - return winrt::Windows::Storage::StorageFolder::GetFolderFromPathAsync(MachinePath()).get(); + const auto path{ MachinePath() }; + if (path.empty()) + { + return nullptr; + } + return winrt::Windows::Storage::StorageFolder::GetFolderFromPathAsync(path).get(); } winrt::Windows::Storage::StorageFolder ApplicationData::RoamingFolder() { + if (!m_applicationData) + { + return nullptr; + } return m_applicationData.RoamingFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::SharedLocalFolder() { + if (!m_applicationData) + { + return nullptr; + } return m_applicationData.SharedLocalFolder(); } winrt::Windows::Storage::StorageFolder ApplicationData::TemporaryFolder() { + if (!m_applicationData) + { + return nullptr; + } return m_applicationData.TemporaryFolder(); } winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::LocalSettings() { + if (!m_applicationData) + { + return nullptr; + } auto applicationDataContainer{ m_applicationData.LocalSettings() }; return winrt::make(applicationDataContainer); } winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::RoamingSettings() { + if (!m_applicationData) + { + return nullptr; + } auto applicationDataContainer{ m_applicationData.RoamingSettings() }; return winrt::make(applicationDataContainer); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAllAsync() { - return m_applicationData.ClearAsync(); + if (!m_applicationData) + { + co_return; + } + co_await m_applicationData.ClearAsync(); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality) { - return m_applicationData.ClearAsync(static_cast(locality)); + if (!m_applicationData) + { + co_return; + } + co_await m_applicationData.ClearAsync(static_cast(locality)); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearPublisherCacheFolderAsync(hstring folderName) { - return m_applicationData.ClearPublisherCacheFolderAsync(folderName); + if (!m_applicationData) + { + co_return; + } + co_await m_applicationData.ClearPublisherCacheFolderAsync(folderName); } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearMachineFolderAsync() { @@ -167,19 +278,61 @@ namespace winrt::Microsoft::Windows::Storage::implementation } void ApplicationData::Close() { - m_applicationData.Close(); + if (m_applicationData) + { + m_applicationData.Close(); + } } hstring ApplicationData::GetPublisherCachePath(hstring const& folderName) { - return m_applicationData.GetPublisherCacheFolder(folderName).Path(); + if (!m_applicationData) + { + return winrt::hstring{}; + } + + try + { + return m_applicationData.GetPublisherCacheFolder(folderName).Path(); + } + catch (winrt::hresult_error& e) + { + // GetPublisherCacheFolder() throws HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) when it doesn't exist + if (e.code() == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) + { + return winrt::hstring{}; + } + + // Nope! We have an actual error + throw; + } } winrt::Windows::Storage::StorageFolder ApplicationData::GetPublisherCacheFolder(hstring const& folderName) { + if (!m_applicationData) + { + return nullptr; + } + + try + { + return m_applicationData.GetPublisherCacheFolder(folderName); + } + catch (winrt::hresult_error& e) + { + // GetPublisherCacheFolder() throws HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) when it doesn't exist + if (e.code() == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) + { + return nullptr; + } + + // Nope! We have an actual error + throw; + } return m_applicationData.GetPublisherCacheFolder(folderName); } std::filesystem::path ApplicationData::_MachinePath(hstring const& packageFamilyName) { - // Path = ...apprepository...\ApplicationData\...pkgfamilyname...\Machine + // Path = HKLM\...apprepository...\ApplicationData\...pkgfamilyname...\Machine // This is typically %ProgramData%\Microsoft\Windows\AppRepository\ApplicationData\...pkgfamilyname...\Machine PCWSTR c_path{ L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Appx" }; PCWSTR c_valueName{ L"PackageRepositoryRoot" }; @@ -189,4 +342,10 @@ namespace winrt::Microsoft::Windows::Storage::implementation path /= "Machine"; return path; } + + bool ApplicationData::_PathExists(std::filesystem::path const& path) + { + const std::filesystem::directory_entry directoryEntry{ path }; + return directoryEntry.is_directory(); + } } diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index 596eb35cc9..e4f807ddb8 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -41,6 +41,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation private: static std::filesystem::path _MachinePath(hstring const& packageFamilyName); + static bool _PathExists(std::filesystem::path const& path); private: winrt::Windows::Storage::ApplicationData m_applicationData; diff --git a/test/ApplicationData/ApplicationDataTests.cpp b/test/ApplicationData/ApplicationDataTests.cpp new file mode 100644 index 0000000000..1c9eee4bae --- /dev/null +++ b/test/ApplicationData/ApplicationDataTests.cpp @@ -0,0 +1,450 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +namespace TB = ::Test::Bootstrap; +namespace TP = ::Test::Packages; + +static const winrt::hstring null_hstring; + +namespace WEX::TestExecution +{ + // Teach TAEF how to format a winrt::hstring + template <> + class VerifyOutputTraits + { + public: + static WEX::Common::NoThrowString ToString(winrt::hstring const& value) + { + const auto s{ value.c_str() }; + if (!s) + { + return WEX::Common::NoThrowString(L"nullptr"); + } + else + { + return WEX::Common::NoThrowString().Format(L"\"%s\"", s); + } + } + }; + + // Teach TAEF how to compare a winrt::hstring + template <> + class VerifyCompareTraits + { + public: + static bool AreEqual(winrt::hstring const& expected, winrt::hstring const& actual) + { + return Compare(expected, actual) == 0; + } + + static bool AreSame(winrt::hstring const& expected, winrt::hstring const& actual) + { + return &expected == &actual; + } + + static bool IsLessThan(winrt::hstring const& expectedLess, winrt::hstring const& expectedGreater) + { + return Compare(expectedLess, expectedGreater) < 0; + } + + static bool IsGreaterThan(winrt::hstring const& expectedGreater, winrt::hstring const& expectedLess) + { + return Compare(expectedGreater, expectedLess) > 0; + } + + static bool IsNull(winrt::hstring const& object) + { + return object.c_str() == nullptr; + } + private: + static int Compare(winrt::hstring const& left, winrt::hstring const& right) + { + if (left == right) + { + return 0; + } + else if (left.c_str() == nullptr) + { + return -1; + } + else if (right.c_str() == nullptr) + { + return 1; + } + else + { + return CompareStringOrdinal(left .c_str(), -1, right.c_str(), -1, FALSE) - CSTR_EQUAL; + } + } + }; +} + +namespace Test::PackageManager::Tests +{ + const auto Main_PackageFamilyName{ ::TP::DynamicDependencyDataStore::c_PackageFamilyName }; + const auto Framework_PackageFamilyName{ ::TP::WindowsAppRuntimeFramework::c_PackageFamilyName }; + + class ApplicationDataTests + { + public: + BEGIN_TEST_CLASS(ApplicationDataTests) + TEST_CLASS_PROPERTY(L"ThreadingModel", L"MTA") + END_TEST_CLASS() + + TEST_CLASS_SETUP(ClassSetup) + { + if (!::WindowsVersion::IsWindows11_21H2OrGreater()) + { + WEX::Logging::Log::Result(WEX::Logging::TestResults::Skipped, L"PackageDeploymentManager requires Win11 >= 21H2 (SV1). Skipping tests"); + return true; + } + ::TB::Setup(); + return true; + } + + TEST_CLASS_CLEANUP(ClassCleanup) + { + ::TB::Cleanup(); + return true; + } + + TEST_METHOD(GetDefault_Main) + { + //TODO + } + + TEST_METHOD(GetDefault_Framework) + { + //TODO + } + + TEST_METHOD(GetForPackageFamily_Main) + { + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + } + + TEST_METHOD(GetForPackageFamily_Framework) + { + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + try + { + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(GetForUser_Main) + { + //TODO + } + + TEST_METHOD(GetForUser_Framework) + { + //TODO + } + + TEST_METHOD(FolderAndPath_Main) + { + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(systemApplicationData); + + const auto localCacheFolder{ applicationData.LocalCacheFolder() }; + const auto localCachePath{ applicationData.LocalCachePath() }; + VERIFY_ARE_EQUAL(localCacheFolder.Path(), localCachePath); + const auto expectedLocalCacheFolder{ systemApplicationData.LocalCacheFolder() }; + const auto expectedLocalCachePath{ expectedLocalCacheFolder.Path() }; + VERIFY_ARE_EQUAL(localCachePath, expectedLocalCachePath); + + const auto localFolder{ applicationData.LocalFolder() }; + const auto localPath{ applicationData.LocalPath() }; + VERIFY_ARE_EQUAL(localFolder.Path(), localPath); + const auto expectedLocalFolder{ systemApplicationData.LocalFolder() }; + const auto expectedLocalPath{ expectedLocalFolder.Path() }; + VERIFY_ARE_EQUAL(localPath, expectedLocalPath); + + const auto roamingFolder{ applicationData.RoamingFolder() }; + const auto roamingPath{ applicationData.RoamingPath() }; + VERIFY_ARE_EQUAL(roamingFolder.Path(), roamingPath); + const auto expectedRoamingFolder{ systemApplicationData.RoamingFolder() }; + const auto expectedRoamingPath{ expectedRoamingFolder.Path() }; + VERIFY_ARE_EQUAL(roamingPath, expectedRoamingPath); + + // SharedLocalFolder is only available if the appropriate group policy is enabled + // If not enabled then SharedLocalFolder = SharedLocalPath = null + const auto sharedLocalFolder{ applicationData.SharedLocalFolder() }; + const auto sharedLocalPath{ applicationData.SharedLocalPath() }; + if (sharedLocalFolder) + { + VERIFY_ARE_EQUAL(sharedLocalFolder.Path(), sharedLocalPath); + } + else + { + VERIFY_IS_NULL(sharedLocalFolder); + VERIFY_ARE_EQUAL(sharedLocalPath, null_hstring); + } + const auto expectedSharedLocalFolder{ systemApplicationData.SharedLocalFolder() }; + winrt::hstring expectedSharedLocalPath; + if (expectedSharedLocalFolder) + { + expectedSharedLocalPath = expectedSharedLocalFolder.Path(); + }; + VERIFY_ARE_EQUAL(sharedLocalPath, expectedSharedLocalPath); + + const auto temporaryFolder{ applicationData.TemporaryFolder() }; + const auto temporaryPath{ applicationData.TemporaryPath() }; + VERIFY_ARE_EQUAL(temporaryFolder.Path(), temporaryPath); + const auto expectedTemporaryFolder{ systemApplicationData.TemporaryFolder() }; + const auto expectedTemporaryPath{ expectedTemporaryFolder.Path() }; + VERIFY_ARE_EQUAL(temporaryPath, expectedTemporaryPath); + } + + TEST_METHOD(FolderAndPath_Framework) + { + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + const auto localCacheFolder{ applicationData.LocalCacheFolder() }; + VERIFY_IS_NULL(localCacheFolder); + const auto localCachePath{ applicationData.LocalCachePath() }; + VERIFY_ARE_EQUAL(localCachePath, null_hstring); + const auto localFolder{ applicationData.LocalFolder() }; + VERIFY_IS_NULL(localFolder); + const auto localPath{ applicationData.LocalPath() }; + VERIFY_ARE_EQUAL(localPath, null_hstring); + const auto roamingFolder{ applicationData.RoamingFolder() }; + VERIFY_IS_NULL(roamingFolder); + const auto roamingPath{ applicationData.RoamingPath() }; + VERIFY_ARE_EQUAL(roamingPath, null_hstring); + const auto sharedLocalFolder{ applicationData.SharedLocalFolder() }; + VERIFY_IS_NULL(sharedLocalFolder); + const auto sharedLocalPath{ applicationData.SharedLocalPath() }; + VERIFY_ARE_EQUAL(sharedLocalPath, null_hstring); + const auto temporaryFolder{ applicationData.TemporaryFolder() }; + VERIFY_IS_NULL(temporaryFolder); + const auto temporaryPath{ applicationData.TemporaryPath() }; + VERIFY_ARE_EQUAL(temporaryPath, null_hstring); + + try + { + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(PublisherCacheFolderAndPath_Main) + { + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + winrt::hstring folderName{ L"Does.Not.Exist" }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(systemApplicationData); + + const auto publisherCacheFolder{ applicationData.GetPublisherCacheFolder(folderName) }; + const auto publisherCachePath{ applicationData.GetPublisherCachePath(folderName) }; + if (publisherCacheFolder) + { + VERIFY_ARE_EQUAL(publisherCacheFolder.Path(), publisherCachePath); + } + else + { + VERIFY_IS_NULL(publisherCacheFolder); + VERIFY_ARE_EQUAL(publisherCachePath, null_hstring); + } + try + { + const auto expectedPublisherCacheFolder{ systemApplicationData.GetPublisherCacheFolder(folderName) }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + const auto expectedPublisherCachePath{ null_hstring }; + VERIFY_ARE_EQUAL(publisherCachePath, expectedPublisherCachePath); + } + + TEST_METHOD(PublisherCacheFolderAndPath_Framework) + { + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + winrt::hstring folderName{ L"Does.Not.Exist" }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + try + { + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + const auto publisherCacheFolder{ applicationData.GetPublisherCacheFolder(folderName) }; + VERIFY_IS_NULL(publisherCacheFolder); + const auto publisherCachePath{ applicationData.GetPublisherCachePath(folderName) }; + VERIFY_ARE_EQUAL(publisherCachePath, null_hstring); + } + + std::filesystem::path GetExpectedMachinePath(winrt::hstring const& packageFamilyName) + { + // Expected Path = HKLM\...apprepository...\ApplicationData\...pkgfamilyname...\Machine + // This is typically %ProgramData%\Microsoft\Windows\AppRepository\ApplicationData\...pkgfamilyname...\Machine + // and by 'typically' we mean 'all current Windows editions' so we'll assume it's true for ease of testing + // and use this test as a canary to detect if/when this is ever not true on any supported platform. + const auto appDataPaths{ winrt::Windows::Storage::AppDataPaths::GetDefault() }; + const std::filesystem::path programData{ appDataPaths.ProgramData().c_str() }; + const auto packageRepositoryRoot{ programData / L"Microsoft\\Windows\\AppRepository\\ApplicationData" }; + const auto packageFamilyRoot{ packageRepositoryRoot / packageFamilyName.c_str() }; + const auto expectedMachinePath{ packageFamilyRoot / L"Machine" }; + return expectedMachinePath; + } + + TEST_METHOD(MachineFolderAndPath_Main_NotSupported) + { + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + VERIFY_IS_FALSE(applicationData.IsMachinePathSupported()); + + const auto machineFolder{ applicationData.MachineFolder() }; + VERIFY_IS_NULL(machineFolder); + const auto machinePath{ applicationData.MachinePath() }; + VERIFY_ARE_EQUAL(machinePath, null_hstring); + + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); + } + + TEST_METHOD(MachineFolderAndPath_Framework_NotSupported) + { + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + VERIFY_IS_TRUE(applicationData.IsMachinePathSupported()); + + const auto machineFolder{ applicationData.MachineFolder() }; + const auto machinePath{ applicationData.MachinePath() }; + VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); + + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); + } + + TEST_METHOD(MachineFolderAndPath_Main_Supported) + { + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + const auto machineFolder{ applicationData.MachineFolder() }; + const auto machinePath{ applicationData.MachinePath() }; + VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); + + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); + } + + TEST_METHOD(MachineFolderAndPath_Framework_Supported) + { + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + const auto machineFolder{ applicationData.MachineFolder() }; + const auto machinePath{ applicationData.MachinePath() }; + VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); + + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); + } + + TEST_METHOD(LocalSettings_Main) + { + //TODO + } + + TEST_METHOD(LocalSettings_Framework) + { + //TODO + } + + TEST_METHOD(RoamingSettings_Main) + { + //TODO + } + + TEST_METHOD(RoamingSettings_Framework) + { + //TODO + } + + TEST_METHOD(ClearAllAsync_Main) + { + //TODO + } + + TEST_METHOD(ClearAllAsync_Framework) + { + //TODO + } + + TEST_METHOD(ClearAsync_Main) + { + //TODO + } + + TEST_METHOD(ClearAsync_Framework) + { + //TODO + } + + TEST_METHOD(ClearPublisherCacheFolderAsync_Main) + { + //TODO + } + + TEST_METHOD(ClearPublisherCacheFolderAsync_Framework) + { + //TODO + } + + TEST_METHOD(ClearMachineAsync_Main) + { + //TODO + } + + TEST_METHOD(ClearMachineAsync_Framework) + { + //TODO + } + }; +} diff --git a/test/ApplicationData/ApplicationDataTests.vcxproj b/test/ApplicationData/ApplicationDataTests.vcxproj new file mode 100644 index 0000000000..25bf3cba4a --- /dev/null +++ b/test/ApplicationData/ApplicationDataTests.vcxproj @@ -0,0 +1,164 @@ + + + + + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + 16.0 + {f4cbbb7a-5575-45b7-b586-2c99d2be81a3} + Win32Proj + ApplicationDataTests + 10.0 + NativeUnitTestProject + ApplicationDataTests + + + DynamicLibrary + false + v143 + Unicode + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + Use + true + pch.h + $(RepoRoot)\test\inc;$(RepoRoot)\dev\common;$(VCInstallDir)UnitTest\include;$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;%(AdditionalIncludeDirectories) + $(RepoRoot);%(AdditionalIncludeDirectories) + + + Windows + onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies) + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL + Microsoft.WindowsAppRuntime.Bootstrap.dll;%(DelayLoadDLLs) + + + + + _DEBUG;%(PreprocessorDefinitions) + + + + + NDEBUG;%(PreprocessorDefinitions) + + + + + WIN32;%(PreprocessorDefinitions) + + + + + Create + + + + + + + + + + + + $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.Storage.winmd + true + + + + + $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.ApplicationModel.WindowsAppRuntime.winmd + true + + + + + + + + {f76b776e-86f5-48c5-8fc7-d2795ecc9746} + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + + + diff --git a/test/ApplicationData/ApplicationDataTests.vcxproj.filters b/test/ApplicationData/ApplicationDataTests.vcxproj.filters new file mode 100644 index 0000000000..889fd37b8a --- /dev/null +++ b/test/ApplicationData/ApplicationDataTests.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + + + + diff --git a/test/ApplicationData/Test.testdef b/test/ApplicationData/Test.testdef new file mode 100644 index 0000000000..1f79b62547 --- /dev/null +++ b/test/ApplicationData/Test.testdef @@ -0,0 +1,11 @@ +{ + "Tests": [ + { + "Description": "ApplicationDataTests tests for feature ApplicationData (arm64 not currently enabled)", + "Filename": "ApplicationDataTests.dll", + "Parameters": "", + "Architectures": ["x86", "x64"], + "Status": "Enabled" + } + ] +} diff --git a/test/ApplicationData/packages.config b/test/ApplicationData/packages.config new file mode 100644 index 0000000000..550cd4a61f --- /dev/null +++ b/test/ApplicationData/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/test/ApplicationData/pch.cpp b/test/ApplicationData/pch.cpp new file mode 100644 index 0000000000..f59e66e263 --- /dev/null +++ b/test/ApplicationData/pch.cpp @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" diff --git a/test/ApplicationData/pch.h b/test/ApplicationData/pch.h new file mode 100644 index 0000000000..4ffd29b8d3 --- /dev/null +++ b/test/ApplicationData/pch.h @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#ifndef PCH_H +#define PCH_H + +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#include + +#include + +#include + +#include +#include +#include + +#endif //PCH_H diff --git a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml index 1450c8b899..c3e1a3a98f 100644 --- a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml +++ b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml @@ -128,6 +128,13 @@ + + + Microsoft.WindowsAppRuntime.dll + + + + Microsoft.WindowsAppRuntime.dll From af79dcfa52901aed4ff35110dcdf2e1dc3598e00 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sat, 30 Dec 2023 18:04:58 -0800 Subject: [PATCH 14/22] Fixed machine path test infra (AppDataPaths doesn't work in our scenario) --- test/ApplicationData/ApplicationDataTests.cpp | 211 +++++++++++++----- test/ApplicationData/pch.h | 4 + 2 files changed, 165 insertions(+), 50 deletions(-) diff --git a/test/ApplicationData/ApplicationDataTests.cpp b/test/ApplicationData/ApplicationDataTests.cpp index 1c9eee4bae..7ebcf66ce7 100644 --- a/test/ApplicationData/ApplicationDataTests.cpp +++ b/test/ApplicationData/ApplicationDataTests.cpp @@ -88,6 +88,21 @@ namespace Test::PackageManager::Tests const auto Main_PackageFamilyName{ ::TP::DynamicDependencyDataStore::c_PackageFamilyName }; const auto Framework_PackageFamilyName{ ::TP::WindowsAppRuntimeFramework::c_PackageFamilyName }; + std::filesystem::path GetExpectedMachinePath(winrt::hstring const& packageFamilyName) + { + // Expected Path = HKLM\...apprepository...\ApplicationData\...pkgfamilyname...\Machine + // This is typically %ProgramData%\Microsoft\Windows\AppRepository\ApplicationData\...pkgfamilyname...\Machine + // and by 'typically' we mean 'all current Windows editions' so we'll assume it's true for ease of testing + // and use this test as a canary to detect if/when this is ever not true on any supported platform. + wil::unique_cotaskmem_string path; + THROW_IF_FAILED(::SHGetKnownFolderPath(FOLDERID_ProgramData, 0, nullptr, wil::out_param(path))); + const std::filesystem::path programData{ path.get() }; + const auto packageRepositoryRoot{ programData / L"Microsoft\\Windows\\AppRepository\\ApplicationData" }; + const auto packageFamilyRoot{ packageRepositoryRoot / packageFamilyName.c_str() }; + const auto expectedMachinePath{ packageFamilyRoot / L"Machine" }; + return expectedMachinePath; + } + class ApplicationDataTests { public: @@ -312,20 +327,6 @@ namespace Test::PackageManager::Tests VERIFY_ARE_EQUAL(publisherCachePath, null_hstring); } - std::filesystem::path GetExpectedMachinePath(winrt::hstring const& packageFamilyName) - { - // Expected Path = HKLM\...apprepository...\ApplicationData\...pkgfamilyname...\Machine - // This is typically %ProgramData%\Microsoft\Windows\AppRepository\ApplicationData\...pkgfamilyname...\Machine - // and by 'typically' we mean 'all current Windows editions' so we'll assume it's true for ease of testing - // and use this test as a canary to detect if/when this is ever not true on any supported platform. - const auto appDataPaths{ winrt::Windows::Storage::AppDataPaths::GetDefault() }; - const std::filesystem::path programData{ appDataPaths.ProgramData().c_str() }; - const auto packageRepositoryRoot{ programData / L"Microsoft\\Windows\\AppRepository\\ApplicationData" }; - const auto packageFamilyRoot{ packageRepositoryRoot / packageFamilyName.c_str() }; - const auto expectedMachinePath{ packageFamilyRoot / L"Machine" }; - return expectedMachinePath; - } - TEST_METHOD(MachineFolderAndPath_Main_NotSupported) { winrt::hstring packageFamilyName{ Main_PackageFamilyName }; @@ -338,9 +339,6 @@ namespace Test::PackageManager::Tests VERIFY_IS_NULL(machineFolder); const auto machinePath{ applicationData.MachinePath() }; VERIFY_ARE_EQUAL(machinePath, null_hstring); - - const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; - VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); } TEST_METHOD(MachineFolderAndPath_Framework_NotSupported) @@ -349,42 +347,12 @@ namespace Test::PackageManager::Tests auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; VERIFY_IS_NOT_NULL(applicationData); - VERIFY_IS_TRUE(applicationData.IsMachinePathSupported()); - - const auto machineFolder{ applicationData.MachineFolder() }; - const auto machinePath{ applicationData.MachinePath() }; - VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); - - const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; - VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); - } - - TEST_METHOD(MachineFolderAndPath_Main_Supported) - { - winrt::hstring packageFamilyName{ Main_PackageFamilyName }; - auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; - VERIFY_IS_NOT_NULL(applicationData); - - const auto machineFolder{ applicationData.MachineFolder() }; - const auto machinePath{ applicationData.MachinePath() }; - VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); - - const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; - VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); - } - - TEST_METHOD(MachineFolderAndPath_Framework_Supported) - { - winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; - auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; - VERIFY_IS_NOT_NULL(applicationData); + VERIFY_IS_FALSE(applicationData.IsMachinePathSupported()); const auto machineFolder{ applicationData.MachineFolder() }; + VERIFY_IS_NULL(machineFolder); const auto machinePath{ applicationData.MachinePath() }; - VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); - - const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; - VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); + VERIFY_ARE_EQUAL(machinePath, null_hstring); } TEST_METHOD(LocalSettings_Main) @@ -447,4 +415,147 @@ namespace Test::PackageManager::Tests //TODO } }; + + + class ApplicationDataTests_Elevated + { + public: + BEGIN_TEST_CLASS(ApplicationDataTests_Elevated) + TEST_CLASS_PROPERTY(L"ThreadingModel", L"MTA") + TEST_CLASS_PROPERTY(L"RunAs", L"RestrictedUser") + TEST_CLASS_PROPERTY(L"RunFixtureAs", L"RestrictedUser") + END_TEST_CLASS() + + TEST_CLASS_SETUP(ClassSetup) + { + if (!::WindowsVersion::IsWindows11_21H2OrGreater()) + { + WEX::Logging::Log::Result(WEX::Logging::TestResults::Skipped, L"PackageDeploymentManager requires Win11 >= 21H2 (SV1). Skipping tests"); + return true; + } + ::TB::Setup(); + return true; + } + + TEST_CLASS_CLEANUP(ClassCleanup) + { + ::TB::Cleanup(); + return true; + } + + static void CreateMachinePathIfNecessary(PCWSTR packageFamilyName) + { + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + const std::filesystem::path path{ expectedMachinePath.c_str() }; + VERIFY_ARE_EQUAL(path.filename(), L"Machine"); + if (std::filesystem::exists(path)) + { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"MachinePath exists: %s", path.c_str())); + } + else + { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"Creating MachinePath: %s", path.c_str())); + wil::CreateDirectoryDeep(path.c_str()); + } + } + + static void RemoveMachinePathIfNecessary(PCWSTR packageFamilyName) + { + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + const std::filesystem::path path{ expectedMachinePath.c_str() }; + VERIFY_ARE_EQUAL(path.filename(), L"Machine"); + const auto packageFamilyPath{ path.parent_path() }; + if (std::filesystem::exists(packageFamilyPath)) + { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"Removing MachinePath's PackageFamily: %s", packageFamilyPath.c_str())); + wil::RemoveDirectoryRecursive(packageFamilyPath.c_str(), wil::RemoveDirectoryOptions::RemoveReadOnly); + } + else + { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"MachinePath's PackageFamily does not exist: %s", packageFamilyPath.c_str())); + } + } + + TEST_METHOD(CreateMachinePathIfNecessary_Framework) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_METHOD_PROPERTY(L"RunAs", L"System") + END_TEST_METHOD_PROPERTIES() + + const auto packageFamilyName{ Framework_PackageFamilyName }; + CreateMachinePathIfNecessary(packageFamilyName); + } + + TEST_METHOD(CreateMachinePathIfNecessary_Main) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_METHOD_PROPERTY(L"RunAs", L"System") + END_TEST_METHOD_PROPERTIES() + + const auto packageFamilyName{ Main_PackageFamilyName }; + CreateMachinePathIfNecessary(packageFamilyName); + } + + TEST_METHOD(MachineFolderAndPath_Main_Supported) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_METHOD_PROPERTY(L"RunAs", L"RestrictedUser") + END_TEST_METHOD_PROPERTIES() + + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + VERIFY_IS_TRUE(applicationData.IsMachinePathSupported()); + + const auto machineFolder{ applicationData.MachineFolder() }; + VERIFY_IS_NOT_NULL(machineFolder); + const auto machinePath{ applicationData.MachinePath() }; + VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); + + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); + } + + TEST_METHOD(MachineFolderAndPath_Framework_Supported) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_METHOD_PROPERTY(L"RunAs", L"RestrictedUser") + END_TEST_METHOD_PROPERTIES() + + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + VERIFY_IS_TRUE(applicationData.IsMachinePathSupported()); + + const auto machineFolder{ applicationData.MachineFolder() }; + VERIFY_IS_NOT_NULL(machineFolder); + const auto machinePath{ applicationData.MachinePath() }; + VERIFY_ARE_EQUAL(machineFolder.Path(), machinePath); + + const auto expectedMachinePath{ GetExpectedMachinePath(packageFamilyName) }; + VERIFY_ARE_EQUAL(machinePath, winrt::hstring(expectedMachinePath.c_str())); + } + + TEST_METHOD(RemoveMachinePathIfNecessary_Main) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_METHOD_PROPERTY(L"RunAs", L"System") + END_TEST_METHOD_PROPERTIES() + + const auto packageFamilyName{ Main_PackageFamilyName }; + RemoveMachinePathIfNecessary(packageFamilyName); + } + + TEST_METHOD(RemoveMachinePathIfNecessary_Framework) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_METHOD_PROPERTY(L"RunAs", L"System") + END_TEST_METHOD_PROPERTIES() + + const auto packageFamilyName{ Framework_PackageFamilyName }; + RemoveMachinePathIfNecessary(packageFamilyName); + } + }; } diff --git a/test/ApplicationData/pch.h b/test/ApplicationData/pch.h index 4ffd29b8d3..2635f15b87 100644 --- a/test/ApplicationData/pch.h +++ b/test/ApplicationData/pch.h @@ -6,7 +6,11 @@ #include +#include +#include + #include +#include #include #include From 8602efe2669eea1e573549cadf3085fd287bc09e Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 2 Jan 2024 23:16:14 -0800 Subject: [PATCH 15/22] Removed method overload per feedback. Added more doc-comments --- dev/ApplicationData/ApplicationData.idl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index 10dfce9cdc..a36c3c5056 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -82,6 +82,7 @@ namespace Microsoft.Windows.Storage /// Get an instance of ApplicationData for the specified user. /// @note This is equivalent to Windows.Storage.ApplicationDataManager.GetForUserAsync() + /// @note GetForUserAsync(null) is equivalent to GetDefault() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getforuserasync static ApplicationData GetForUser(Windows.System.User user); @@ -97,10 +98,12 @@ namespace Microsoft.Windows.Storage Boolean IsMachinePathSupported(); /// Return the path for the local cache data store not included in backup and restore operations. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.LocalCacheFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localcachefolder String LocalCachePath { get; }; /// Return the path for the local data store. This location is backed up to the cloud. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.LocalFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localfolder String LocalPath { get; }; @@ -110,14 +113,17 @@ namespace Microsoft.Windows.Storage /// Return the path for the roaming data store. /// @warning Roaming data and settings are no longer supported after Windows 10 version 1901 (aka 19H1 aka 10.0.18363.0). + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.RoamingFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingfolder String RoamingPath { get; }; /// Return the path for the shared data store. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.SharedLocalFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.sharedlocalfolder String SharedLocalPath { get; }; /// Return the path for the temporary data store. + /// @note This is equivalent to Windows.Storage.ApplicationDataManager.TemporaryFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.temporaryfolder String TemporaryPath { get; }; @@ -155,6 +161,7 @@ namespace Microsoft.Windows.Storage ApplicationDataContainer RoamingSettings { get; }; /// Remove all data from the local, local cache, roaming, and temporary data stores. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearasync /// @see LocalCachePath /// @see LocalCacheFolder /// @see LocalPath @@ -163,15 +170,16 @@ namespace Microsoft.Windows.Storage /// @see RoamingFolder /// @see TemporaryPath /// @see TemporaryFolder - [method_name("ClearAsync")] Windows.Foundation.IAsyncAction ClearAllAsync(); /// Remove all data from the specified data store. + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearasync Windows.Foundation.IAsyncAction ClearAsync(ApplicationDataLocality locality); /// Remove all data from the shared data store in the specified subfolder. /// @see SharedLocalPath /// @see SharedLocalFolder + /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearpublishercachefolderasync Windows.Foundation.IAsyncAction ClearPublisherCacheFolderAsync(String folderName); /// Remove all data from machine data store. From 42615b91cd45a72253551a3494bd3cb14df95760 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 2 Jan 2024 23:16:57 -0800 Subject: [PATCH 16/22] More fixes and optimizations --- dev/ApplicationData/M.W.S.ApplicationData.cpp | 59 +++++++++---------- dev/ApplicationData/M.W.S.ApplicationData.h | 1 + 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 7e0cdcc4b1..7aac4a0ddf 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -17,6 +17,7 @@ static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Local)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::LocalCache) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::LocalCache)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Roaming)); +static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::SharedLocal) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::SharedLocal)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Temporary) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Temporary)); namespace winrt::Microsoft::Windows::Storage::implementation @@ -108,7 +109,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation { return winrt::hstring{}; } - return m_applicationData.LocalCacheFolder().Path(); + return StorageFolderToPath(m_applicationData.LocalCacheFolder()); } hstring ApplicationData::LocalPath() { @@ -116,7 +117,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation { return winrt::hstring{}; } - return m_applicationData.LocalFolder().Path(); + return StorageFolderToPath(m_applicationData.LocalFolder()); } hstring ApplicationData::MachinePath() { @@ -134,7 +135,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation { return winrt::hstring{}; } - return m_applicationData.RoamingFolder().Path(); + return StorageFolderToPath(m_applicationData.RoamingFolder()); } hstring ApplicationData::SharedLocalPath() { @@ -152,13 +153,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation // // @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.sharedlocalfolder - auto sharedLocalFolder{ m_applicationData.SharedLocalFolder() }; - winrt::hstring path; - if (sharedLocalFolder) - { - path = sharedLocalFolder.Path(); - } - return path; + return StorageFolderToPath(m_applicationData.SharedLocalFolder()); } hstring ApplicationData::TemporaryPath() { @@ -166,7 +161,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation { return winrt::hstring{}; } - return m_applicationData.TemporaryFolder().Path(); + return StorageFolderToPath(m_applicationData.TemporaryFolder()); } winrt::Windows::Storage::StorageFolder ApplicationData::LocalCacheFolder() { @@ -249,7 +244,14 @@ namespace winrt::Microsoft::Windows::Storage::implementation { co_return; } - co_await m_applicationData.ClearAsync(static_cast(locality)); + if (locality == winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Machine) + { + co_await ClearMachineFolderAsync(); + } + else + { + co_await m_applicationData.ClearAsync(static_cast(locality)); + } } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearPublisherCacheFolderAsync(hstring folderName) { @@ -285,26 +287,13 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::GetPublisherCachePath(hstring const& folderName) { - if (!m_applicationData) - { - return winrt::hstring{}; - } - - try - { - return m_applicationData.GetPublisherCacheFolder(folderName).Path(); - } - catch (winrt::hresult_error& e) + auto folder{ GetPublisherCacheFolder(folderName) }; + winrt::hstring path; + if (folder) { - // GetPublisherCacheFolder() throws HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) when it doesn't exist - if (e.code() == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) - { - return winrt::hstring{}; - } - - // Nope! We have an actual error - throw; + path = folder.Path(); } + return path; } winrt::Windows::Storage::StorageFolder ApplicationData::GetPublisherCacheFolder(hstring const& folderName) { @@ -328,7 +317,6 @@ namespace winrt::Microsoft::Windows::Storage::implementation // Nope! We have an actual error throw; } - return m_applicationData.GetPublisherCacheFolder(folderName); } std::filesystem::path ApplicationData::_MachinePath(hstring const& packageFamilyName) { @@ -348,4 +336,13 @@ namespace winrt::Microsoft::Windows::Storage::implementation const std::filesystem::directory_entry directoryEntry{ path }; return directoryEntry.is_directory(); } + winrt::hstring ApplicationData::StorageFolderToPath(winrt::Windows::Storage::StorageFolder storageFolder) + { + winrt::hstring path; + if (storageFolder) + { + path = storageFolder.Path(); + } + return path; + } } diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index e4f807ddb8..41d1266525 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -42,6 +42,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation private: static std::filesystem::path _MachinePath(hstring const& packageFamilyName); static bool _PathExists(std::filesystem::path const& path); + static hstring StorageFolderToPath(winrt::Windows::Storage::StorageFolder storageFolder); private: winrt::Windows::Storage::ApplicationData m_applicationData; From 7ee354f6d15006e94b069c82ff98d17ba535e345 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 2 Jan 2024 23:17:05 -0800 Subject: [PATCH 17/22] More test coverage --- test/ApplicationData/ApplicationDataTests.cpp | 312 +++++++++++++++++- 1 file changed, 306 insertions(+), 6 deletions(-) diff --git a/test/ApplicationData/ApplicationDataTests.cpp b/test/ApplicationData/ApplicationDataTests.cpp index 7ebcf66ce7..b8fbf3680a 100644 --- a/test/ApplicationData/ApplicationDataTests.cpp +++ b/test/ApplicationData/ApplicationDataTests.cpp @@ -357,22 +357,322 @@ namespace Test::PackageManager::Tests TEST_METHOD(LocalSettings_Main) { - //TODO + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(systemApplicationData); + + const auto localSettings{ applicationData.LocalSettings() }; + const auto systemLocalSettings{ systemApplicationData.LocalSettings() }; + VERIFY_ARE_EQUAL(static_cast(localSettings.Locality()), static_cast(systemLocalSettings.Locality())); + + auto containers{ localSettings.Containers() }; + VERIFY_ARE_EQUAL(0u, containers.Size()); + auto systemContainers{ systemLocalSettings.Containers() }; + VERIFY_ARE_EQUAL(0u, systemContainers.Size()); + VERIFY_ARE_EQUAL(containers.Size(), systemContainers.Size()); + + const winrt::hstring foodAndStuff{ L"FoodAndStuff" }; + VERIFY_IS_FALSE(containers.HasKey(foodAndStuff)); + VERIFY_IS_FALSE(systemContainers.HasKey(foodAndStuff)); + + auto container{ localSettings.CreateContainer(foodAndStuff, winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition::Always) }; + VERIFY_ARE_EQUAL(foodAndStuff, container.Name()); + // + VERIFY_ARE_EQUAL(0u, containers.Size()); + VERIFY_IS_FALSE(containers.HasKey(foodAndStuff)); + containers = localSettings.Containers(); + VERIFY_ARE_EQUAL(1u, containers.Size()); + VERIFY_IS_TRUE(containers.HasKey(foodAndStuff)); + container = containers.Lookup(foodAndStuff); + VERIFY_IS_NOT_NULL(container); + VERIFY_ARE_EQUAL(foodAndStuff, container.Name()); + // + VERIFY_ARE_EQUAL(0u, systemContainers.Size()); + VERIFY_IS_FALSE(systemContainers.HasKey(foodAndStuff)); + systemContainers = systemLocalSettings.Containers(); + VERIFY_ARE_EQUAL(1u, systemContainers.Size()); + VERIFY_IS_TRUE(systemContainers.HasKey(foodAndStuff)); + auto systemContainer{ systemContainers.Lookup(foodAndStuff) }; + VERIFY_IS_NOT_NULL(systemContainer); + VERIFY_ARE_EQUAL(foodAndStuff, systemContainer.Name()); + + const winrt::hstring keyMeat{ L"Meat" }; + const winrt::hstring rawValueSteak{ L"Steak" }; + auto valueSteak{ winrt::Windows::Foundation::PropertyValue::CreateString(rawValueSteak) }; + auto values{ container.Values() }; + VERIFY_ARE_EQUAL(0u, values.Size()); + values.Insert(keyMeat, valueSteak); + VERIFY_ARE_EQUAL(1u, values.Size()); + auto steak{ values.Lookup(keyMeat) }; + VERIFY_IS_NOT_NULL(steak); + auto steakLookupAsReferenceString{ steak.try_as>() }; + VERIFY_IS_NOT_NULL(steakLookupAsReferenceString); + auto steakString{ steakLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueSteak, steakString); + // + auto systemValues{ systemContainer.Values() }; + VERIFY_ARE_EQUAL(1u, systemValues.Size()); + auto systemSteak{ systemValues.Lookup(keyMeat) }; + VERIFY_IS_NOT_NULL(systemSteak); + auto systemSteakLookupAsReferenceString{ systemSteak.try_as>() }; + VERIFY_IS_NOT_NULL(systemSteakLookupAsReferenceString); + auto systemSteakString{ systemSteakLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueSteak, systemSteakString); + + const winrt::hstring keyDrink{ L"Drink" }; + const winrt::hstring rawValueWhiskey{ L"Whiskey" }; + auto valueWhiskey{ winrt::Windows::Foundation::PropertyValue::CreateString(rawValueWhiskey) }; + VERIFY_ARE_EQUAL(1u, systemValues.Size()); + systemValues.Insert(keyDrink, valueWhiskey); + VERIFY_ARE_EQUAL(2u, systemValues.Size()); + auto systemWhiskey{ systemValues.Lookup(keyDrink) }; + VERIFY_IS_NOT_NULL(systemWhiskey); + auto systemWhiskeyLookupAsReferenceString{ systemWhiskey.try_as>() }; + VERIFY_IS_NOT_NULL(systemWhiskeyLookupAsReferenceString); + auto systemWhiskeyString{ systemWhiskeyLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueWhiskey, systemWhiskeyString); + // + VERIFY_ARE_EQUAL(2u, values.Size()); + auto whiskey{ values.Lookup(keyDrink) }; + VERIFY_IS_NOT_NULL(whiskey); + auto whiskeyLookupAsReferenceString{ whiskey.try_as>() }; + VERIFY_IS_NOT_NULL(whiskeyLookupAsReferenceString); + auto whiskeyString{ whiskeyLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueWhiskey, whiskeyString); + + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local, container.Locality()); + container.Close(); + try + { + auto locality{ container.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + VERIFY_ARE_EQUAL(winrt::Windows::Storage::ApplicationDataLocality::Local, systemContainer.Locality()); + systemContainer.Close(); + try + { + auto locality{ systemContainer.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + VERIFY_ARE_EQUAL(1u, localSettings.Containers().Size()); + VERIFY_ARE_EQUAL(1u, systemLocalSettings.Containers().Size()); + localSettings.DeleteContainer(foodAndStuff); + VERIFY_ARE_EQUAL(0u, localSettings.Containers().Size()); + VERIFY_ARE_EQUAL(0u, systemLocalSettings.Containers().Size()); + + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local, localSettings.Locality()); + localSettings.Close(); + try + { + auto locality{ localSettings.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + VERIFY_ARE_EQUAL(winrt::Windows::Storage::ApplicationDataLocality::Local, systemLocalSettings.Locality()); + systemLocalSettings.Close(); + try + { + auto locality{ systemLocalSettings.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } } TEST_METHOD(LocalSettings_Framework) { - //TODO + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + const auto localSettings{ applicationData.LocalSettings() }; + VERIFY_IS_NULL(localSettings); + + try + { + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } } TEST_METHOD(RoamingSettings_Main) { - //TODO + winrt::hstring packageFamilyName{ Main_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(systemApplicationData); + + const auto roamingSettings{ applicationData.RoamingSettings() }; + const auto systemRoamingSettings{ systemApplicationData.RoamingSettings() }; + VERIFY_ARE_EQUAL(static_cast(roamingSettings.Locality()), static_cast(systemRoamingSettings.Locality())); + + auto containers{ roamingSettings.Containers() }; + VERIFY_ARE_EQUAL(0u, containers.Size()); + auto systemContainers{ systemRoamingSettings.Containers() }; + VERIFY_ARE_EQUAL(0u, systemContainers.Size()); + VERIFY_ARE_EQUAL(containers.Size(), systemContainers.Size()); + + const winrt::hstring foodAndStuff{ L"FoodAndStuff" }; + VERIFY_IS_FALSE(containers.HasKey(foodAndStuff)); + VERIFY_IS_FALSE(systemContainers.HasKey(foodAndStuff)); + + auto container{ roamingSettings.CreateContainer(foodAndStuff, winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition::Always) }; + VERIFY_ARE_EQUAL(foodAndStuff, container.Name()); + // + VERIFY_ARE_EQUAL(0u, containers.Size()); + VERIFY_IS_FALSE(containers.HasKey(foodAndStuff)); + containers = roamingSettings.Containers(); + VERIFY_ARE_EQUAL(1u, containers.Size()); + VERIFY_IS_TRUE(containers.HasKey(foodAndStuff)); + container = containers.Lookup(foodAndStuff); + VERIFY_IS_NOT_NULL(container); + VERIFY_ARE_EQUAL(foodAndStuff, container.Name()); + // + VERIFY_ARE_EQUAL(0u, systemContainers.Size()); + VERIFY_IS_FALSE(systemContainers.HasKey(foodAndStuff)); + systemContainers = systemRoamingSettings.Containers(); + VERIFY_ARE_EQUAL(1u, systemContainers.Size()); + VERIFY_IS_TRUE(systemContainers.HasKey(foodAndStuff)); + auto systemContainer{ systemContainers.Lookup(foodAndStuff) }; + VERIFY_IS_NOT_NULL(systemContainer); + VERIFY_ARE_EQUAL(foodAndStuff, systemContainer.Name()); + + const winrt::hstring keyMeat{ L"Meat" }; + const winrt::hstring rawValueSteak{ L"Steak" }; + auto valueSteak{ winrt::Windows::Foundation::PropertyValue::CreateString(rawValueSteak) }; + auto values{ container.Values() }; + VERIFY_ARE_EQUAL(0u, values.Size()); + values.Insert(keyMeat, valueSteak); + VERIFY_ARE_EQUAL(1u, values.Size()); + auto steak{ values.Lookup(keyMeat) }; + VERIFY_IS_NOT_NULL(steak); + auto steakLookupAsReferenceString{ steak.try_as>() }; + VERIFY_IS_NOT_NULL(steakLookupAsReferenceString); + auto steakString{ steakLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueSteak, steakString); + // + auto systemValues{ systemContainer.Values() }; + VERIFY_ARE_EQUAL(1u, systemValues.Size()); + auto systemSteak{ systemValues.Lookup(keyMeat) }; + VERIFY_IS_NOT_NULL(systemSteak); + auto systemSteakLookupAsReferenceString{ systemSteak.try_as>() }; + VERIFY_IS_NOT_NULL(systemSteakLookupAsReferenceString); + auto systemSteakString{ systemSteakLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueSteak, systemSteakString); + + const winrt::hstring keyDrink{ L"Drink" }; + const winrt::hstring rawValueWhiskey{ L"Whiskey" }; + auto valueWhiskey{ winrt::Windows::Foundation::PropertyValue::CreateString(rawValueWhiskey) }; + VERIFY_ARE_EQUAL(1u, systemValues.Size()); + systemValues.Insert(keyDrink, valueWhiskey); + VERIFY_ARE_EQUAL(2u, systemValues.Size()); + auto systemWhiskey{ systemValues.Lookup(keyDrink) }; + VERIFY_IS_NOT_NULL(systemWhiskey); + auto systemWhiskeyLookupAsReferenceString{ systemWhiskey.try_as>() }; + VERIFY_IS_NOT_NULL(systemWhiskeyLookupAsReferenceString); + auto systemWhiskeyString{ systemWhiskeyLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueWhiskey, systemWhiskeyString); + // + VERIFY_ARE_EQUAL(2u, values.Size()); + auto whiskey{ values.Lookup(keyDrink) }; + VERIFY_IS_NOT_NULL(whiskey); + auto whiskeyLookupAsReferenceString{ whiskey.try_as>() }; + VERIFY_IS_NOT_NULL(whiskeyLookupAsReferenceString); + auto whiskeyString{ whiskeyLookupAsReferenceString.GetString() }; + VERIFY_ARE_EQUAL(rawValueWhiskey, whiskeyString); + + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming, container.Locality()); + container.Close(); + try + { + auto roamingity{ container.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + VERIFY_ARE_EQUAL(winrt::Windows::Storage::ApplicationDataLocality::Roaming, systemContainer.Locality()); + systemContainer.Close(); + try + { + auto roamingity{ systemContainer.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + VERIFY_ARE_EQUAL(1u, roamingSettings.Containers().Size()); + VERIFY_ARE_EQUAL(1u, systemRoamingSettings.Containers().Size()); + roamingSettings.DeleteContainer(foodAndStuff); + VERIFY_ARE_EQUAL(0u, roamingSettings.Containers().Size()); + VERIFY_ARE_EQUAL(0u, systemRoamingSettings.Containers().Size()); + + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming, roamingSettings.Locality()); + roamingSettings.Close(); + try + { + auto roamingity{ roamingSettings.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + VERIFY_ARE_EQUAL(winrt::Windows::Storage::ApplicationDataLocality::Roaming, systemRoamingSettings.Locality()); + systemRoamingSettings.Close(); + try + { + auto roamingity{ systemRoamingSettings.Locality() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } } TEST_METHOD(RoamingSettings_Framework) { - //TODO + winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; + auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; + VERIFY_IS_NOT_NULL(applicationData); + const auto roamingSettings{ applicationData.RoamingSettings() }; + VERIFY_IS_NULL(roamingSettings); + + try + { + auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } } TEST_METHOD(ClearAllAsync_Main) @@ -405,12 +705,12 @@ namespace Test::PackageManager::Tests //TODO } - TEST_METHOD(ClearMachineAsync_Main) + TEST_METHOD(ClearMachineFolderAsync_Main) { //TODO } - TEST_METHOD(ClearMachineAsync_Framework) + TEST_METHOD(ClearMachineFolderAsync_Framework) { //TODO } From 8223a84799b2a0affc5496f3b8d7cc857ab13fc5 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 2 Jan 2024 23:41:29 -0800 Subject: [PATCH 18/22] Updated MachinePath/etc to only be accessible if a package in the family is registered to the user OR running as SYSTEM --- dev/ApplicationData/M.W.S.ApplicationData.cpp | 29 +++++++++++++++++++ dev/ApplicationData/M.W.S.ApplicationData.h | 1 + dev/ApplicationData/pch.h | 2 ++ dev/WindowsAppRuntime_DLL/pch.h | 1 + 4 files changed, 33 insertions(+) diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 7aac4a0ddf..63c9f30932 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -100,6 +100,11 @@ namespace winrt::Microsoft::Windows::Storage::implementation } bool ApplicationData::IsMachinePathSupported() { + if (!IsMachinePathAccessAllowed(m_packageFamilyName)) + { + return false; + } + const auto path{ _MachinePath(m_packageFamilyName) }; return _PathExists(path); } @@ -121,6 +126,11 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::MachinePath() { + if (!IsMachinePathAccessAllowed(m_packageFamilyName)) + { + throw hresult_access_denied(); + } + const auto path{ _MachinePath(m_packageFamilyName) }; winrt::hstring machinePath; if (_PathExists(path)) @@ -330,6 +340,25 @@ namespace winrt::Microsoft::Windows::Storage::implementation path /= "Machine"; return path; } + bool ApplicationData::IsMachinePathAccessAllowed(hstring const& packageFamilyName) + { + // Gotta have the package family registered for the user OR the user is SYSTEM + if (::Security::User::IsLocalSystem()) + { + return true; + } + + winrt::Windows::Management::Deployment::PackageManager packageManager; + auto packages{ packageManager.FindPackagesForUser(winrt::hstring{}, packageFamilyName) }; + auto packagesVector{ packages.try_as>() }; + if (packagesVector.Size() > 0) + { + return true; + } + + // Required conditions not met. Access denied + return false; + } bool ApplicationData::_PathExists(std::filesystem::path const& path) { diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index 41d1266525..e84d907563 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -41,6 +41,7 @@ namespace winrt::Microsoft::Windows::Storage::implementation private: static std::filesystem::path _MachinePath(hstring const& packageFamilyName); + static bool IsMachinePathAccessAllowed(hstring const& packageFamilyName); static bool _PathExists(std::filesystem::path const& path); static hstring StorageFolderToPath(winrt::Windows::Storage::StorageFolder storageFolder); diff --git a/dev/ApplicationData/pch.h b/dev/ApplicationData/pch.h index ec56d476e4..786111d0d5 100644 --- a/dev/ApplicationData/pch.h +++ b/dev/ApplicationData/pch.h @@ -23,7 +23,9 @@ #include #include +#include #include #include #include +#include diff --git a/dev/WindowsAppRuntime_DLL/pch.h b/dev/WindowsAppRuntime_DLL/pch.h index 350c4d8350..e1ebb70298 100644 --- a/dev/WindowsAppRuntime_DLL/pch.h +++ b/dev/WindowsAppRuntime_DLL/pch.h @@ -54,6 +54,7 @@ #include #include #include +#include #include #include From fbe64c36da65ecdc26463e48738c66c6cbec119d Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Thu, 11 Jan 2024 10:04:59 -0800 Subject: [PATCH 19/22] Removed ClearAllAsync() and ClearMachineAsync(). Use ClearAsync(locality) --- dev/ApplicationData/ApplicationData.idl | 17 -------- dev/ApplicationData/M.W.S.ApplicationData.cpp | 42 ++++++++----------- dev/ApplicationData/M.W.S.ApplicationData.h | 3 +- test/ApplicationData/ApplicationDataTests.cpp | 18 ++------ 4 files changed, 22 insertions(+), 58 deletions(-) diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index a36c3c5056..5da3efa50e 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -160,18 +160,6 @@ namespace Microsoft.Windows.Storage /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingsettings ApplicationDataContainer RoamingSettings { get; }; - /// Remove all data from the local, local cache, roaming, and temporary data stores. - /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearasync - /// @see LocalCachePath - /// @see LocalCacheFolder - /// @see LocalPath - /// @see LocalFolder - /// @see RoamingPath - /// @see RoamingFolder - /// @see TemporaryPath - /// @see TemporaryFolder - Windows.Foundation.IAsyncAction ClearAllAsync(); - /// Remove all data from the specified data store. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearasync Windows.Foundation.IAsyncAction ClearAsync(ApplicationDataLocality locality); @@ -182,11 +170,6 @@ namespace Microsoft.Windows.Storage /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearpublishercachefolderasync Windows.Foundation.IAsyncAction ClearPublisherCacheFolderAsync(String folderName); - /// Remove all data from machine data store. - /// @see MachineLocalPath - /// @see MachineLocalFolder - Windows.Foundation.IAsyncAction ClearMachineFolderAsync(); - /// Return the path for the shared data store for the publisher of the app. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getpublishercachefolder String GetPublisherCachePath(String folderName); diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index 63c9f30932..ca48c82a9b 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -240,14 +240,6 @@ namespace winrt::Microsoft::Windows::Storage::implementation auto applicationDataContainer{ m_applicationData.RoamingSettings() }; return winrt::make(applicationDataContainer); } - winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAllAsync() - { - if (!m_applicationData) - { - co_return; - } - co_await m_applicationData.ClearAsync(); - } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality) { if (!m_applicationData) @@ -271,23 +263,6 @@ namespace winrt::Microsoft::Windows::Storage::implementation } co_await m_applicationData.ClearPublisherCacheFolderAsync(folderName); } - winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearMachineFolderAsync() - { - const auto path{ MachinePath() }; - - auto logTelemetry{ ApplicationDataTelemetry::ClearMachineFolderAsync::Start(path) }; - - auto strong{ get_strong() }; - - logTelemetry.IgnoreCurrentThread(); - co_await winrt::resume_background(); - auto logTelemetryContinuation{ logTelemetry.ContinueOnCurrentThread() }; - - const auto options{ wil::RemoveDirectoryOptions::KeepRootDirectory | wil::RemoveDirectoryOptions::RemoveReadOnly }; - wil::RemoveDirectoryRecursive(path.c_str(), options); - - logTelemetry.Stop(); - } void ApplicationData::Close() { if (m_applicationData) @@ -305,6 +280,23 @@ namespace winrt::Microsoft::Windows::Storage::implementation } return path; } + winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearMachineFolderAsync() + { + const auto path{ MachinePath() }; + + auto logTelemetry{ ApplicationDataTelemetry::ClearMachineFolderAsync::Start(path) }; + + auto strong{ get_strong() }; + + logTelemetry.IgnoreCurrentThread(); + co_await winrt::resume_background(); + auto logTelemetryContinuation{ logTelemetry.ContinueOnCurrentThread() }; + + const auto options{ wil::RemoveDirectoryOptions::KeepRootDirectory | wil::RemoveDirectoryOptions::RemoveReadOnly }; + wil::RemoveDirectoryRecursive(path.c_str(), options); + + logTelemetry.Stop(); + } winrt::Windows::Storage::StorageFolder ApplicationData::GetPublisherCacheFolder(hstring const& folderName) { if (!m_applicationData) diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index e84d907563..cce950da1d 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -31,15 +31,14 @@ namespace winrt::Microsoft::Windows::Storage::implementation winrt::Windows::Storage::StorageFolder TemporaryFolder(); winrt::Microsoft::Windows::Storage::ApplicationDataContainer LocalSettings(); winrt::Microsoft::Windows::Storage::ApplicationDataContainer RoamingSettings(); - winrt::Windows::Foundation::IAsyncAction ClearAllAsync(); winrt::Windows::Foundation::IAsyncAction ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality); winrt::Windows::Foundation::IAsyncAction ClearPublisherCacheFolderAsync(hstring folderName); - winrt::Windows::Foundation::IAsyncAction ClearMachineFolderAsync(); void Close(); hstring GetPublisherCachePath(hstring const& folderName); winrt::Windows::Storage::StorageFolder GetPublisherCacheFolder(hstring const& folderName); private: + winrt::Windows::Foundation::IAsyncAction ClearMachineFolderAsync(); static std::filesystem::path _MachinePath(hstring const& packageFamilyName); static bool IsMachinePathAccessAllowed(hstring const& packageFamilyName); static bool _PathExists(std::filesystem::path const& path); diff --git a/test/ApplicationData/ApplicationDataTests.cpp b/test/ApplicationData/ApplicationDataTests.cpp index b8fbf3680a..3bfd0dfdcf 100644 --- a/test/ApplicationData/ApplicationDataTests.cpp +++ b/test/ApplicationData/ApplicationDataTests.cpp @@ -675,16 +675,6 @@ namespace Test::PackageManager::Tests } } - TEST_METHOD(ClearAllAsync_Main) - { - //TODO - } - - TEST_METHOD(ClearAllAsync_Framework) - { - //TODO - } - TEST_METHOD(ClearAsync_Main) { //TODO @@ -695,22 +685,22 @@ namespace Test::PackageManager::Tests //TODO } - TEST_METHOD(ClearPublisherCacheFolderAsync_Main) + TEST_METHOD(ClearFolderAsync_Machine_Main) { //TODO } - TEST_METHOD(ClearPublisherCacheFolderAsync_Framework) + TEST_METHOD(ClearFolderAsync_Machine_Framework) { //TODO } - TEST_METHOD(ClearMachineFolderAsync_Main) + TEST_METHOD(ClearPublisherCacheFolderAsync_Main) { //TODO } - TEST_METHOD(ClearMachineFolderAsync_Framework) + TEST_METHOD(ClearPublisherCacheFolderAsync_Framework) { //TODO } From 7f0f82e2e599cb29850c89681e28153217564426 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sat, 27 Jan 2024 16:13:05 -0800 Subject: [PATCH 20/22] Updated per API Review --- dev/ApplicationData/ApplicationData.idl | 50 ++--- dev/ApplicationData/M.W.S.ApplicationData.cpp | 68 +------ dev/ApplicationData/M.W.S.ApplicationData.h | 6 +- .../M.W.S.ApplicationDataContainer.cpp | 1 - test/ApplicationData/ApplicationDataTests.cpp | 171 ------------------ 5 files changed, 25 insertions(+), 271 deletions(-) diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index 5da3efa50e..05e9986642 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -5,13 +5,11 @@ namespace Microsoft.Windows.Storage { - [feature(Feature_ApplicationData)] [contractversion(1)] apicontract ApplicationDataContract{}; /// Specifies the type of data store. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatalocality - [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] enum ApplicationDataLocality { @@ -19,14 +17,12 @@ namespace Microsoft.Windows.Storage // Values 1000+ are unique to us here. Local = 0, LocalCache = 3, - Roaming = 1, SharedLocal = 4, Temporary = 2, Machine = 1000, }; /// Specifies options for creating application data containers or returning existing containers. - [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] enum ApplicationDataCreateDisposition { @@ -39,7 +35,6 @@ namespace Microsoft.Windows.Storage /// Represents a container for settings. The methods and properties of this class support creating, deleting, enumerating, and traversing the container hierarchy. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdatacontainer - [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] runtimeclass ApplicationDataContainer : Windows.Foundation.IClosable { @@ -70,7 +65,6 @@ namespace Microsoft.Windows.Storage /// Provides access to the application data store. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata - [feature(Feature_ApplicationData)] [contract(ApplicationDataContract, 1)] runtimeclass ApplicationData : Windows.Foundation.IClosable { @@ -81,7 +75,7 @@ namespace Microsoft.Windows.Storage static ApplicationData GetDefault(); /// Get an instance of ApplicationData for the specified user. - /// @note This is equivalent to Windows.Storage.ApplicationDataManager.GetForUserAsync() + /// @note This is equivalent to Windows.Storage.ApplicationData.GetForUserAsync() /// @note GetForUserAsync(null) is equivalent to GetDefault() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getforuserasync static ApplicationData GetForUser(Windows.System.User user); @@ -92,38 +86,34 @@ namespace Microsoft.Windows.Storage static ApplicationData GetForPackageFamily(String packageFamilyName); /// Get an instance of ApplicationData for the specified unpackaged app for the current user. - static ApplicationData GetForUnpackaged(String publisher, String name); + static ApplicationData GetForUnpackaged(String publisher, String product); /// Return true if the package family supports the machine data store. - Boolean IsMachinePathSupported(); + Boolean IsMachinePathSupported { get; }; /// Return the path for the local cache data store not included in backup and restore operations. - /// @note This is equivalent to Windows.Storage.ApplicationDataManager.LocalCacheFolder().Path() + /// @note This is equivalent to Windows.Storage.ApplicationData.LocalCacheFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localcachefolder String LocalCachePath { get; }; /// Return the path for the local data store. This location is backed up to the cloud. - /// @note This is equivalent to Windows.Storage.ApplicationDataManager.LocalFolder().Path() + /// @note This is equivalent to Windows.Storage.ApplicationData.LocalFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localfolder String LocalPath { get; }; /// Return the path for the machine data store. /// @note This location is per-machine (not per-user like other *Path properties). + /// @note Empty string is returned if not supported. + /// @see IsMachinePathSupported String MachinePath { get; }; - /// Return the path for the roaming data store. - /// @warning Roaming data and settings are no longer supported after Windows 10 version 1901 (aka 19H1 aka 10.0.18363.0). - /// @note This is equivalent to Windows.Storage.ApplicationDataManager.RoamingFolder().Path() - /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingfolder - String RoamingPath { get; }; - /// Return the path for the shared data store. - /// @note This is equivalent to Windows.Storage.ApplicationDataManager.SharedLocalFolder().Path() + /// @note This is equivalent to Windows.Storage.ApplicationData.SharedLocalFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.sharedlocalfolder String SharedLocalPath { get; }; /// Return the path for the temporary data store. - /// @note This is equivalent to Windows.Storage.ApplicationDataManager.TemporaryFolder().Path() + /// @note This is equivalent to Windows.Storage.ApplicationData.TemporaryFolder().Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.temporaryfolder String TemporaryPath { get; }; @@ -137,13 +127,10 @@ namespace Microsoft.Windows.Storage /// Return a StorageFolder for the machine data store. /// @note This location is per-machine (not per-user like other *Folder properties). + /// @note `null` is returned if not supported. + /// @see IsMachinePathSupported Windows.Storage.StorageFolder MachineFolder { get; }; - /// Return a StorageFolder for the roaming data store. - /// @warning Roaming data and settings are no longer supported after Windows 10 version 1901 (aka 19H1 aka 10.0.18363.0). - /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingfolder - Windows.Storage.StorageFolder RoamingFolder { get; }; - /// Return a StorageFolder for the shared data store. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.sharedlocalfolder Windows.Storage.StorageFolder SharedLocalFolder { get; }; @@ -156,25 +143,22 @@ namespace Microsoft.Windows.Storage /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.localsettings ApplicationDataContainer LocalSettings { get; }; - /// Return the settings container in the roaming data store. - /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.roamingsettings - ApplicationDataContainer RoamingSettings { get; }; - /// Remove all data from the specified data store. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearasync Windows.Foundation.IAsyncAction ClearAsync(ApplicationDataLocality locality); - /// Remove all data from the shared data store in the specified subfolder. - /// @see SharedLocalPath - /// @see SharedLocalFolder + /// Clear the files and subfolders from the specified subfolder of the shared storage folder for the publisher. + /// @see GetPublisherCachePath() + /// @see GetPublisherCacheFolder() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.clearpublishercachefolderasync Windows.Foundation.IAsyncAction ClearPublisherCacheFolderAsync(String folderName); - /// Return the path for the shared data store for the publisher of the app. + /// Return the specified path of the shared data store for the publisher of the app. + /// @note This is equivalent to Windows.Storage.ApplicationData.GetPublisherCacheFolder(folderName).Path() /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getpublishercachefolder String GetPublisherCachePath(String folderName); - /// Return a StorageFolder for the shared data store for the publisher of the app. + /// Return the specified subfolder of the shared data store for the publisher of the app. /// @see https://learn.microsoft.com/uwp/api/windows.storage.applicationdata.getpublishercachefolder Windows.Storage.StorageFolder GetPublisherCacheFolder(String folderName); } diff --git a/dev/ApplicationData/M.W.S.ApplicationData.cpp b/dev/ApplicationData/M.W.S.ApplicationData.cpp index ca48c82a9b..4b9d1ddaa2 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationData.cpp @@ -16,7 +16,6 @@ static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Local)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::LocalCache) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::LocalCache)); -static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Roaming)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::SharedLocal) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::SharedLocal)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Temporary) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Temporary)); @@ -93,20 +92,15 @@ namespace winrt::Microsoft::Windows::Storage::implementation throw; } } - winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUnpackaged(hstring const& publisher, hstring const& name) + winrt::Microsoft::Windows::Storage::ApplicationData ApplicationData::GetForUnpackaged(hstring const& publisher, hstring const& product) { // TODO implement GetForUnpackaged throw hresult_not_implemented(); } bool ApplicationData::IsMachinePathSupported() { - if (!IsMachinePathAccessAllowed(m_packageFamilyName)) - { - return false; - } - const auto path{ _MachinePath(m_packageFamilyName) }; - return _PathExists(path); + return !path.empty(); } hstring ApplicationData::LocalCachePath() { @@ -126,26 +120,8 @@ namespace winrt::Microsoft::Windows::Storage::implementation } hstring ApplicationData::MachinePath() { - if (!IsMachinePathAccessAllowed(m_packageFamilyName)) - { - throw hresult_access_denied(); - } - const auto path{ _MachinePath(m_packageFamilyName) }; - winrt::hstring machinePath; - if (_PathExists(path)) - { - machinePath = path.c_str(); - } - return machinePath; - } - hstring ApplicationData::RoamingPath() - { - if (!m_applicationData) - { - return winrt::hstring{}; - } - return StorageFolderToPath(m_applicationData.RoamingFolder()); + return winrt::hstring{ path.c_str() }; } hstring ApplicationData::SharedLocalPath() { @@ -198,14 +174,6 @@ namespace winrt::Microsoft::Windows::Storage::implementation } return winrt::Windows::Storage::StorageFolder::GetFolderFromPathAsync(path).get(); } - winrt::Windows::Storage::StorageFolder ApplicationData::RoamingFolder() - { - if (!m_applicationData) - { - return nullptr; - } - return m_applicationData.RoamingFolder(); - } winrt::Windows::Storage::StorageFolder ApplicationData::SharedLocalFolder() { if (!m_applicationData) @@ -231,15 +199,6 @@ namespace winrt::Microsoft::Windows::Storage::implementation auto applicationDataContainer{ m_applicationData.LocalSettings() }; return winrt::make(applicationDataContainer); } - winrt::Microsoft::Windows::Storage::ApplicationDataContainer ApplicationData::RoamingSettings() - { - if (!m_applicationData) - { - return nullptr; - } - auto applicationDataContainer{ m_applicationData.RoamingSettings() }; - return winrt::make(applicationDataContainer); - } winrt::Windows::Foundation::IAsyncAction ApplicationData::ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality) { if (!m_applicationData) @@ -330,26 +289,13 @@ namespace winrt::Microsoft::Windows::Storage::implementation auto path{ appRepository / L"ApplicationData" }; path /= packageFamilyName.c_str(); path /= "Machine"; - return path; - } - bool ApplicationData::IsMachinePathAccessAllowed(hstring const& packageFamilyName) - { - // Gotta have the package family registered for the user OR the user is SYSTEM - if (::Security::User::IsLocalSystem()) - { - return true; - } - winrt::Windows::Management::Deployment::PackageManager packageManager; - auto packages{ packageManager.FindPackagesForUser(winrt::hstring{}, packageFamilyName) }; - auto packagesVector{ packages.try_as>() }; - if (packagesVector.Size() > 0) + // Does it exist? + if (_PathExists(path)) { - return true; + return path; } - - // Required conditions not met. Access denied - return false; + return std::filesystem::path{}; } bool ApplicationData::_PathExists(std::filesystem::path const& path) diff --git a/dev/ApplicationData/M.W.S.ApplicationData.h b/dev/ApplicationData/M.W.S.ApplicationData.h index cce950da1d..8256e50701 100644 --- a/dev/ApplicationData/M.W.S.ApplicationData.h +++ b/dev/ApplicationData/M.W.S.ApplicationData.h @@ -15,22 +15,19 @@ namespace winrt::Microsoft::Windows::Storage::implementation static winrt::Microsoft::Windows::Storage::ApplicationData GetDefault(); static winrt::Microsoft::Windows::Storage::ApplicationData GetForUser(winrt::Windows::System::User user); static winrt::Microsoft::Windows::Storage::ApplicationData GetForPackageFamily(hstring const& packageFamilyName); - static winrt::Microsoft::Windows::Storage::ApplicationData GetForUnpackaged(hstring const& publisher, hstring const& name); + static winrt::Microsoft::Windows::Storage::ApplicationData GetForUnpackaged(hstring const& publisher, hstring const& product); bool IsMachinePathSupported(); hstring LocalCachePath(); hstring LocalPath(); hstring MachinePath(); - hstring RoamingPath(); hstring SharedLocalPath(); hstring TemporaryPath(); winrt::Windows::Storage::StorageFolder LocalCacheFolder(); winrt::Windows::Storage::StorageFolder LocalFolder(); winrt::Windows::Storage::StorageFolder MachineFolder(); - winrt::Windows::Storage::StorageFolder RoamingFolder(); winrt::Windows::Storage::StorageFolder SharedLocalFolder(); winrt::Windows::Storage::StorageFolder TemporaryFolder(); winrt::Microsoft::Windows::Storage::ApplicationDataContainer LocalSettings(); - winrt::Microsoft::Windows::Storage::ApplicationDataContainer RoamingSettings(); winrt::Windows::Foundation::IAsyncAction ClearAsync(winrt::Microsoft::Windows::Storage::ApplicationDataLocality locality); winrt::Windows::Foundation::IAsyncAction ClearPublisherCacheFolderAsync(hstring folderName); void Close(); @@ -40,7 +37,6 @@ namespace winrt::Microsoft::Windows::Storage::implementation private: winrt::Windows::Foundation::IAsyncAction ClearMachineFolderAsync(); static std::filesystem::path _MachinePath(hstring const& packageFamilyName); - static bool IsMachinePathAccessAllowed(hstring const& packageFamilyName); static bool _PathExists(std::filesystem::path const& path); static hstring StorageFolderToPath(winrt::Windows::Storage::StorageFolder storageFolder); diff --git a/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp b/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp index fe6ab3ea48..b5181a619f 100644 --- a/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp +++ b/dev/ApplicationData/M.W.S.ApplicationDataContainer.cpp @@ -31,7 +31,6 @@ namespace winrt::Microsoft::Windows::Storage::implementation { static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Local) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Local)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::LocalCache) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::LocalCache)); - static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Roaming)); static_assert(static_cast(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Temporary) == static_cast(winrt::Windows::Storage::ApplicationDataLocality::Temporary)); return static_cast(m_applicationDataContainer.Locality()); diff --git a/test/ApplicationData/ApplicationDataTests.cpp b/test/ApplicationData/ApplicationDataTests.cpp index 3bfd0dfdcf..b2abadb45e 100644 --- a/test/ApplicationData/ApplicationDataTests.cpp +++ b/test/ApplicationData/ApplicationDataTests.cpp @@ -197,13 +197,6 @@ namespace Test::PackageManager::Tests const auto expectedLocalPath{ expectedLocalFolder.Path() }; VERIFY_ARE_EQUAL(localPath, expectedLocalPath); - const auto roamingFolder{ applicationData.RoamingFolder() }; - const auto roamingPath{ applicationData.RoamingPath() }; - VERIFY_ARE_EQUAL(roamingFolder.Path(), roamingPath); - const auto expectedRoamingFolder{ systemApplicationData.RoamingFolder() }; - const auto expectedRoamingPath{ expectedRoamingFolder.Path() }; - VERIFY_ARE_EQUAL(roamingPath, expectedRoamingPath); - // SharedLocalFolder is only available if the appropriate group policy is enabled // If not enabled then SharedLocalFolder = SharedLocalPath = null const auto sharedLocalFolder{ applicationData.SharedLocalFolder() }; @@ -246,10 +239,6 @@ namespace Test::PackageManager::Tests VERIFY_IS_NULL(localFolder); const auto localPath{ applicationData.LocalPath() }; VERIFY_ARE_EQUAL(localPath, null_hstring); - const auto roamingFolder{ applicationData.RoamingFolder() }; - VERIFY_IS_NULL(roamingFolder); - const auto roamingPath{ applicationData.RoamingPath() }; - VERIFY_ARE_EQUAL(roamingPath, null_hstring); const auto sharedLocalFolder{ applicationData.SharedLocalFolder() }; VERIFY_IS_NULL(sharedLocalFolder); const auto sharedLocalPath{ applicationData.SharedLocalPath() }; @@ -515,166 +504,6 @@ namespace Test::PackageManager::Tests } } - TEST_METHOD(RoamingSettings_Main) - { - winrt::hstring packageFamilyName{ Main_PackageFamilyName }; - auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; - VERIFY_IS_NOT_NULL(applicationData); - - auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; - VERIFY_IS_NOT_NULL(systemApplicationData); - - const auto roamingSettings{ applicationData.RoamingSettings() }; - const auto systemRoamingSettings{ systemApplicationData.RoamingSettings() }; - VERIFY_ARE_EQUAL(static_cast(roamingSettings.Locality()), static_cast(systemRoamingSettings.Locality())); - - auto containers{ roamingSettings.Containers() }; - VERIFY_ARE_EQUAL(0u, containers.Size()); - auto systemContainers{ systemRoamingSettings.Containers() }; - VERIFY_ARE_EQUAL(0u, systemContainers.Size()); - VERIFY_ARE_EQUAL(containers.Size(), systemContainers.Size()); - - const winrt::hstring foodAndStuff{ L"FoodAndStuff" }; - VERIFY_IS_FALSE(containers.HasKey(foodAndStuff)); - VERIFY_IS_FALSE(systemContainers.HasKey(foodAndStuff)); - - auto container{ roamingSettings.CreateContainer(foodAndStuff, winrt::Microsoft::Windows::Storage::ApplicationDataCreateDisposition::Always) }; - VERIFY_ARE_EQUAL(foodAndStuff, container.Name()); - // - VERIFY_ARE_EQUAL(0u, containers.Size()); - VERIFY_IS_FALSE(containers.HasKey(foodAndStuff)); - containers = roamingSettings.Containers(); - VERIFY_ARE_EQUAL(1u, containers.Size()); - VERIFY_IS_TRUE(containers.HasKey(foodAndStuff)); - container = containers.Lookup(foodAndStuff); - VERIFY_IS_NOT_NULL(container); - VERIFY_ARE_EQUAL(foodAndStuff, container.Name()); - // - VERIFY_ARE_EQUAL(0u, systemContainers.Size()); - VERIFY_IS_FALSE(systemContainers.HasKey(foodAndStuff)); - systemContainers = systemRoamingSettings.Containers(); - VERIFY_ARE_EQUAL(1u, systemContainers.Size()); - VERIFY_IS_TRUE(systemContainers.HasKey(foodAndStuff)); - auto systemContainer{ systemContainers.Lookup(foodAndStuff) }; - VERIFY_IS_NOT_NULL(systemContainer); - VERIFY_ARE_EQUAL(foodAndStuff, systemContainer.Name()); - - const winrt::hstring keyMeat{ L"Meat" }; - const winrt::hstring rawValueSteak{ L"Steak" }; - auto valueSteak{ winrt::Windows::Foundation::PropertyValue::CreateString(rawValueSteak) }; - auto values{ container.Values() }; - VERIFY_ARE_EQUAL(0u, values.Size()); - values.Insert(keyMeat, valueSteak); - VERIFY_ARE_EQUAL(1u, values.Size()); - auto steak{ values.Lookup(keyMeat) }; - VERIFY_IS_NOT_NULL(steak); - auto steakLookupAsReferenceString{ steak.try_as>() }; - VERIFY_IS_NOT_NULL(steakLookupAsReferenceString); - auto steakString{ steakLookupAsReferenceString.GetString() }; - VERIFY_ARE_EQUAL(rawValueSteak, steakString); - // - auto systemValues{ systemContainer.Values() }; - VERIFY_ARE_EQUAL(1u, systemValues.Size()); - auto systemSteak{ systemValues.Lookup(keyMeat) }; - VERIFY_IS_NOT_NULL(systemSteak); - auto systemSteakLookupAsReferenceString{ systemSteak.try_as>() }; - VERIFY_IS_NOT_NULL(systemSteakLookupAsReferenceString); - auto systemSteakString{ systemSteakLookupAsReferenceString.GetString() }; - VERIFY_ARE_EQUAL(rawValueSteak, systemSteakString); - - const winrt::hstring keyDrink{ L"Drink" }; - const winrt::hstring rawValueWhiskey{ L"Whiskey" }; - auto valueWhiskey{ winrt::Windows::Foundation::PropertyValue::CreateString(rawValueWhiskey) }; - VERIFY_ARE_EQUAL(1u, systemValues.Size()); - systemValues.Insert(keyDrink, valueWhiskey); - VERIFY_ARE_EQUAL(2u, systemValues.Size()); - auto systemWhiskey{ systemValues.Lookup(keyDrink) }; - VERIFY_IS_NOT_NULL(systemWhiskey); - auto systemWhiskeyLookupAsReferenceString{ systemWhiskey.try_as>() }; - VERIFY_IS_NOT_NULL(systemWhiskeyLookupAsReferenceString); - auto systemWhiskeyString{ systemWhiskeyLookupAsReferenceString.GetString() }; - VERIFY_ARE_EQUAL(rawValueWhiskey, systemWhiskeyString); - // - VERIFY_ARE_EQUAL(2u, values.Size()); - auto whiskey{ values.Lookup(keyDrink) }; - VERIFY_IS_NOT_NULL(whiskey); - auto whiskeyLookupAsReferenceString{ whiskey.try_as>() }; - VERIFY_IS_NOT_NULL(whiskeyLookupAsReferenceString); - auto whiskeyString{ whiskeyLookupAsReferenceString.GetString() }; - VERIFY_ARE_EQUAL(rawValueWhiskey, whiskeyString); - - VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming, container.Locality()); - container.Close(); - try - { - auto roamingity{ container.Locality() }; - VERIFY_FAIL(L"Success is not expected"); - } - catch (winrt::hresult_error& e) - { - VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); - } - VERIFY_ARE_EQUAL(winrt::Windows::Storage::ApplicationDataLocality::Roaming, systemContainer.Locality()); - systemContainer.Close(); - try - { - auto roamingity{ systemContainer.Locality() }; - VERIFY_FAIL(L"Success is not expected"); - } - catch (winrt::hresult_error& e) - { - VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); - } - - VERIFY_ARE_EQUAL(1u, roamingSettings.Containers().Size()); - VERIFY_ARE_EQUAL(1u, systemRoamingSettings.Containers().Size()); - roamingSettings.DeleteContainer(foodAndStuff); - VERIFY_ARE_EQUAL(0u, roamingSettings.Containers().Size()); - VERIFY_ARE_EQUAL(0u, systemRoamingSettings.Containers().Size()); - - VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Storage::ApplicationDataLocality::Roaming, roamingSettings.Locality()); - roamingSettings.Close(); - try - { - auto roamingity{ roamingSettings.Locality() }; - VERIFY_FAIL(L"Success is not expected"); - } - catch (winrt::hresult_error& e) - { - VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); - } - VERIFY_ARE_EQUAL(winrt::Windows::Storage::ApplicationDataLocality::Roaming, systemRoamingSettings.Locality()); - systemRoamingSettings.Close(); - try - { - auto roamingity{ systemRoamingSettings.Locality() }; - VERIFY_FAIL(L"Success is not expected"); - } - catch (winrt::hresult_error& e) - { - VERIFY_ARE_EQUAL(RO_E_CLOSED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); - } - } - - TEST_METHOD(RoamingSettings_Framework) - { - winrt::hstring packageFamilyName{ Framework_PackageFamilyName }; - auto applicationData{ winrt::Microsoft::Windows::Storage::ApplicationData::GetForPackageFamily(packageFamilyName) }; - VERIFY_IS_NOT_NULL(applicationData); - const auto roamingSettings{ applicationData.RoamingSettings() }; - VERIFY_IS_NULL(roamingSettings); - - try - { - auto systemApplicationData{ winrt::Windows::Management::Core::ApplicationDataManager::CreateForPackageFamily(packageFamilyName) }; - VERIFY_FAIL(L"Success is not expected"); - } - catch (winrt::hresult_error& e) - { - VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); - } - } - TEST_METHOD(ClearAsync_Main) { //TODO From 549eba51442206da746bb4347c7836338ac601b5 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sat, 27 Jan 2024 22:15:12 -0800 Subject: [PATCH 21/22] Fixed build error --- test/inc/WindowsAppRuntime.Test.Diagnostics.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/inc/WindowsAppRuntime.Test.Diagnostics.h b/test/inc/WindowsAppRuntime.Test.Diagnostics.h index d9097663c4..9d546c3510 100644 --- a/test/inc/WindowsAppRuntime.Test.Diagnostics.h +++ b/test/inc/WindowsAppRuntime.Test.Diagnostics.h @@ -13,6 +13,8 @@ #include #include +#include + namespace Test::Diagnostics { inline PCWSTR IntegrityLevelToString(DWORD integrityLevel) @@ -38,9 +40,7 @@ inline void DumpUser(PCWSTR context, _In_ HANDLE token, PSID userSid) VERIFY_WIN32_BOOL_SUCCEEDED(ConvertSidToStringSidW(userSid, &userSidAsString)); WEX::Logging::Log::Comment(WEX::Common::String().Format(L"UserSid:%s %s", context, userSidAsString.get())); - wistd::unique_ptr tokenMandatoryLabel; - VERIFY_SUCCEEDED(wil::get_token_information_nothrow(tokenMandatoryLabel, token)); - const DWORD integrityLevel{ *GetSidSubAuthority((*tokenMandatoryLabel).Label.Sid, static_cast(static_cast(*GetSidSubAuthorityCount((*tokenMandatoryLabel).Label.Sid) - 1))) }; + const DWORD integrityLevel{ ::Security::IntegrityLevel::GetIntegrityLevel(token) }; WEX::Logging::Log::Comment(WEX::Common::String().Format(L"IntegrityLevel: 0x%08X (%s)", integrityLevel, IntegrityLevelToString(integrityLevel))); } else From e1c98053deb80c07c957cb3089f27d10a417a9a1 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 25 Jun 2024 00:25:43 -0700 Subject: [PATCH 22/22] Fixed bad merge. Added ApplicationData Projection --- WindowsAppRuntime.sln | 77 +++++++++++-------- build/CopyFilesToStagingDir.ps1 | 4 + .../WindowsAppSDK-Nuget-Native.WinRt.props | 7 +- .../WindowsAppSDK-Nuget-Native.targets | 7 ++ dev/ApplicationData/ApplicationData.idl | 4 +- ...icrosoft.Windows.Storage.Projection.csproj | 58 ++++++++++++++ specs/applicationdata/ApplicationData.md | 4 +- 7 files changed, 127 insertions(+), 34 deletions(-) create mode 100644 dev/Projections/CS/Microsoft.Windows.Storage.Projection/Microsoft.Windows.Storage.Projection.csproj diff --git a/WindowsAppRuntime.sln b/WindowsAppRuntime.sln index 879d61ee3b..9ed382084f 100644 --- a/WindowsAppRuntime.sln +++ b/WindowsAppRuntime.sln @@ -488,22 +488,23 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PackageManager.Test.F.Redde EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackageManager.Test.F.Redder.msix", "test\PackageManager\data\PackageManager.Test.F.Redder.msix\PackageManager.Test.F.Redder.msix.vcxproj", "{D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workloads", "Workloads", "{48948EF9-8B91-4F7A-98AD-0F8FA3EFAA38}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Workloads", "dev\Workloads\Workloads.vcxitems", "{B5798CEB-4E60-4D2D-B456-7C406B5F5B67}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.Management.Deployment.Projection", "dev\Projections\CS\Microsoft.Windows.Management.Deployment.Projection\Microsoft.Windows.Management.Deployment.Projection.csproj", "{57E6CCBE-EDEB-4300-8334-98A591D11B3F}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationData", "ApplicationData", "{E3023618-8435-444B-988E-3F898BD17724}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationData", "ApplicationData", "{095B9BD4-CBBD-417E-84E9-63F2C3EA2BFC}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ApplicationData", "dev\ApplicationData\ApplicationData.vcxitems", "{7CF52890-56FA-47E2-84FB-68EE274324B6}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationData", "ApplicationData", "{27C67ECD-0C3F-410A-AEF7-83AA257787E8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationData", "ApplicationData", "{B6440BA7-351C-4EAB-B38E-88995085643B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ApplicationDataTests", "test\ApplicationData\ApplicationDataTests.vcxproj", "{F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}" ProjectSection(ProjectDependencies) = postProject - {9C1A6C58-52D6-4514-9120-5C339C5DF4BE} = {9C1A6C58-52D6-4514-9120-5C339C5DF4BE} - {B71E818A-882E-456A-87E5-4DE4A6602B99} = {B71E818A-882E-456A-87E5-4DE4A6602B99} {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.Management.Deployment.Projection", "dev\Projections\CS\Microsoft.Windows.Management.Deployment.Projection\Microsoft.Windows.Management.Deployment.Projection.csproj", "{57E6CCBE-EDEB-4300-8334-98A591D11B3F}" + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.Storage.Projection", "dev\Projections\CS\Microsoft.Windows.Storage.Projection\Microsoft.Windows.Storage.Projection.csproj", "{A43865A2-151E-4064-B5DA-445DFF9688D9}" ProjectSection(ProjectDependencies) = postProject {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} EndProjectSection @@ -1738,22 +1739,6 @@ Global {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x64.Build.0 = Release|x64 {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x86.ActiveCfg = Release|Win32 {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x86.Build.0 = Release|Win32 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|Any CPU.ActiveCfg = Debug|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|Any CPU.Build.0 = Debug|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|ARM64.Build.0 = Debug|ARM64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x64.ActiveCfg = Debug|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x64.Build.0 = Debug|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x86.ActiveCfg = Debug|Win32 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x86.Build.0 = Debug|Win32 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|Any CPU.ActiveCfg = Release|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|Any CPU.Build.0 = Release|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|ARM64.ActiveCfg = Release|ARM64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|ARM64.Build.0 = Release|ARM64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x64.ActiveCfg = Release|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x64.Build.0 = Release|x64 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x86.ActiveCfg = Release|Win32 - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x86.Build.0 = Release|Win32 {57E6CCBE-EDEB-4300-8334-98A591D11B3F}.Debug|Any CPU.ActiveCfg = Debug|x64 {57E6CCBE-EDEB-4300-8334-98A591D11B3F}.Debug|Any CPU.Build.0 = Debug|x64 {57E6CCBE-EDEB-4300-8334-98A591D11B3F}.Debug|ARM64.ActiveCfg = Debug|arm64 @@ -1770,6 +1755,38 @@ Global {57E6CCBE-EDEB-4300-8334-98A591D11B3F}.Release|x64.Build.0 = Release|x64 {57E6CCBE-EDEB-4300-8334-98A591D11B3F}.Release|x86.ActiveCfg = Release|x86 {57E6CCBE-EDEB-4300-8334-98A591D11B3F}.Release|x86.Build.0 = Release|x86 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|Any CPU.Build.0 = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|ARM64.Build.0 = Debug|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x64.ActiveCfg = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x64.Build.0 = Debug|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x86.ActiveCfg = Debug|Win32 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Debug|x86.Build.0 = Debug|Win32 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|Any CPU.ActiveCfg = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|Any CPU.Build.0 = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|ARM64.ActiveCfg = Release|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|ARM64.Build.0 = Release|ARM64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x64.ActiveCfg = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x64.Build.0 = Release|x64 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x86.ActiveCfg = Release|Win32 + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3}.Release|x86.Build.0 = Release|Win32 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|Any CPU.ActiveCfg = Debug|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|Any CPU.Build.0 = Debug|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|ARM64.ActiveCfg = Debug|arm64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|ARM64.Build.0 = Debug|arm64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|x64.ActiveCfg = Debug|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|x64.Build.0 = Debug|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|x86.ActiveCfg = Debug|x86 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Debug|x86.Build.0 = Debug|x86 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|Any CPU.ActiveCfg = Release|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|Any CPU.Build.0 = Release|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|ARM64.ActiveCfg = Release|arm64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|ARM64.Build.0 = Release|arm64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|x64.ActiveCfg = Release|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|x64.Build.0 = Release|x64 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|x86.ActiveCfg = Release|x86 + {A43865A2-151E-4064-B5DA-445DFF9688D9}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1918,13 +1935,12 @@ Global {FBAE1876-C50A-4EFC-A686-3008B6438731} = {39A17DBB-F1DB-4D0C-B90E-D5F9BEC2283A} {B6B68924-6A0B-457E-AD53-018696EC8889} = {B03C7C69-0A52-4553-B465-04C995161E42} {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2} = {B6B68924-6A0B-457E-AD53-018696EC8889} - {48948EF9-8B91-4F7A-98AD-0F8FA3EFAA38} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} - {B5798CEB-4E60-4D2D-B456-7C406B5F5B67} = {48948EF9-8B91-4F7A-98AD-0F8FA3EFAA38} - {E3023618-8435-444B-988E-3F898BD17724} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} - {7CF52890-56FA-47E2-84FB-68EE274324B6} = {E3023618-8435-444B-988E-3F898BD17724} - {27C67ECD-0C3F-410A-AEF7-83AA257787E8} = {8630F7AA-2969-4DC9-8700-9B468C1DC21D} - {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3} = {27C67ECD-0C3F-410A-AEF7-83AA257787E8} {57E6CCBE-EDEB-4300-8334-98A591D11B3F} = {716C26A0-E6B0-4981-8412-D14A4D410531} + {095B9BD4-CBBD-417E-84E9-63F2C3EA2BFC} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} + {7CF52890-56FA-47E2-84FB-68EE274324B6} = {095B9BD4-CBBD-417E-84E9-63F2C3EA2BFC} + {B6440BA7-351C-4EAB-B38E-88995085643B} = {8630F7AA-2969-4DC9-8700-9B468C1DC21D} + {F4CBBB7A-5575-45B7-B586-2C99D2BE81A3} = {B6440BA7-351C-4EAB-B38E-88995085643B} + {A43865A2-151E-4064-B5DA-445DFF9688D9} = {716C26A0-E6B0-4981-8412-D14A4D410531} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4B3D7591-CFEC-4762-9A07-ABE99938FB77} @@ -1939,7 +1955,6 @@ Global test\inc\inc.vcxitems*{56a1d696-feda-4333-bf37-772ebececb10}*SharedItemsImports = 4 test\inc\inc.vcxitems*{5b2d17fe-c371-417f-860c-3d32397c2404}*SharedItemsImports = 4 test\inc\inc.vcxitems*{7c502995-59c3-483b-86ba-815985353633}*SharedItemsImports = 4 - dev\ApplicationData\ApplicationData.vcxitems*{7cf52890-56fa-47e2-84fb-68ee274324b6}*SharedItemsImports = 9 dev\Common\Common.vcxitems*{8828053c-d6ec-4744-8624-f8c676c2d4df}*SharedItemsImports = 9 dev\Licensing\Licensing.vcxitems*{885a43fa-052d-4b0d-a2dc-13ee15796435}*SharedItemsImports = 9 dev\PackageManager\API\PackageManager.vcxitems*{8a9a0c85-65a8-4bca-a49e-45fc4fdbc7d2}*SharedItemsImports = 9 diff --git a/build/CopyFilesToStagingDir.ps1 b/build/CopyFilesToStagingDir.ps1 index 6ceac3cd06..6a786b0269 100644 --- a/build/CopyFilesToStagingDir.ps1 +++ b/build/CopyFilesToStagingDir.ps1 @@ -47,6 +47,7 @@ PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windo PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.Management.Deployment.winmd $FullPublishDir\Microsoft.WindowsAppRuntime\ PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.PushNotifications.winmd $FullPublishDir\Microsoft.WindowsAppRuntime\ PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.Security.AccessControl.winmd $FullPublishDir\Microsoft.WindowsAppRuntime\ +PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.Storage.winmd $FullPublishDir\Microsoft.WindowsAppRuntime\ PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.System.Power.winmd $FullPublishDir\Microsoft.WindowsAppRuntime\ PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.System.winmd $FullPublishDir\Microsoft.WindowsAppRuntime\ PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\MsixDynamicDependency.h $FullPublishDir\Microsoft.WindowsAppRuntime\ @@ -114,6 +115,8 @@ PublishFile $FullBuildOutput\Microsoft.Windows.PushNotifications.Projection\Micr PublishFile $FullBuildOutput\Microsoft.Windows.PushNotifications.Projection\Microsoft.Windows.PushNotifications.Projection.pdb $NugetDir\lib\net6.0-windows10.0.17763.0 PublishFile $FullBuildOutput\Microsoft.Windows.Security.AccessControl.Projection\Microsoft.Windows.Security.AccessControl.Projection.dll $NugetDir\lib\net6.0-windows10.0.17763.0 PublishFile $FullBuildOutput\Microsoft.Windows.Security.AccessControl.Projection\Microsoft.Windows.Security.AccessControl.Projection.pdb $NugetDir\lib\net6.0-windows10.0.17763.0 +PublishFile $FullBuildOutput\Microsoft.Windows.Storage.Projection\Microsoft.Windows.Storage.Projection.dll $NugetDir\lib\net6.0-windows10.0.17763.0 +PublishFile $FullBuildOutput\Microsoft.Windows.Storage.Projection\Microsoft.Windows.Storage.Projection.pdb $NugetDir\lib\net6.0-windows10.0.17763.0 PublishFile $FullBuildOutput\Microsoft.Windows.System.Power.Projection\Microsoft.Windows.System.Power.Projection.dll $NugetDir\lib\net6.0-windows10.0.17763.0 PublishFile $FullBuildOutput\Microsoft.Windows.System.Power.Projection\Microsoft.Windows.System.Power.Projection.pdb $NugetDir\lib\net6.0-windows10.0.17763.0 PublishFile $FullBuildOutput\Microsoft.Windows.System.Projection\Microsoft.Windows.System.Projection.dll $NugetDir\lib\net6.0-windows10.0.17763.0 @@ -181,6 +184,7 @@ PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windo PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.Management.Deployment.winmd $NugetDir\lib\uap10.0 PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.PushNotifications.winmd $NugetDir\lib\uap10.0 PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.Security.AccessControl.winmd $NugetDir\lib\uap10.0 +PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.Storage.winmd $NugetDir\lib\uap10.0 PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.System.Power.winmd $NugetDir\lib\uap10.0 PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.System.winmd $NugetDir\lib\uap10.0 # diff --git a/build/NuSpecs/WindowsAppSDK-Nuget-Native.WinRt.props b/build/NuSpecs/WindowsAppSDK-Nuget-Native.WinRt.props index 9b721a7abc..86ac93e096 100644 --- a/build/NuSpecs/WindowsAppSDK-Nuget-Native.WinRt.props +++ b/build/NuSpecs/WindowsAppSDK-Nuget-Native.WinRt.props @@ -25,6 +25,11 @@ $(MSBuildThisFileDirectory)..\..\runtimes\win10-$(_WindowsAppSDKFoundationPlatform)\native\Microsoft.WindowsAppRuntime.dll true + + $(MSBuildThisFileDirectory)..\..\lib\uap10.0\Microsoft.Windows.Storage.winmd + $(MSBuildThisFileDirectory)..\..\runtimes\win10-$(_WindowsAppSDKFoundationPlatform)\native\Microsoft.WindowsAppRuntime.dll + true + $(MSBuildThisFileDirectory)..\..\lib\uap10.0\Microsoft.Windows.System.Power.winmd $(MSBuildThisFileDirectory)..\..\runtimes\win10-$(_WindowsAppSDKFoundationPlatform)\native\Microsoft.WindowsAppRuntime.dll @@ -36,7 +41,7 @@ true - $(MSBuildThisFileDirectory)..\..\lib\uap10.0\Microsoft.Windows.System.winmd $(MSBuildThisFileDirectory)..\..\runtimes\win10-$(_WindowsAppSDKFoundationPlatform)\native\Microsoft.WindowsAppRuntime.dll diff --git a/build/NuSpecs/WindowsAppSDK-Nuget-Native.targets b/build/NuSpecs/WindowsAppSDK-Nuget-Native.targets index cc8c36d467..904986af27 100644 --- a/build/NuSpecs/WindowsAppSDK-Nuget-Native.targets +++ b/build/NuSpecs/WindowsAppSDK-Nuget-Native.targets @@ -30,6 +30,13 @@ + + + false + Microsoft.WindowsAppRuntime.dll + + + false diff --git a/dev/ApplicationData/ApplicationData.idl b/dev/ApplicationData/ApplicationData.idl index 05e9986642..ebbbcedd76 100644 --- a/dev/ApplicationData/ApplicationData.idl +++ b/dev/ApplicationData/ApplicationData.idl @@ -5,7 +5,7 @@ namespace Microsoft.Windows.Storage { - [contractversion(1)] + [contractversion(2)] apicontract ApplicationDataContract{}; /// Specifies the type of data store. @@ -86,6 +86,8 @@ namespace Microsoft.Windows.Storage static ApplicationData GetForPackageFamily(String packageFamilyName); /// Get an instance of ApplicationData for the specified unpackaged app for the current user. + [feature(Feature_ApplicationData)] + [contract(ApplicationDataContract, 2)] static ApplicationData GetForUnpackaged(String publisher, String product); /// Return true if the package family supports the machine data store. diff --git a/dev/Projections/CS/Microsoft.Windows.Storage.Projection/Microsoft.Windows.Storage.Projection.csproj b/dev/Projections/CS/Microsoft.Windows.Storage.Projection/Microsoft.Windows.Storage.Projection.csproj new file mode 100644 index 0000000000..df2773f8b4 --- /dev/null +++ b/dev/Projections/CS/Microsoft.Windows.Storage.Projection/Microsoft.Windows.Storage.Projection.csproj @@ -0,0 +1,58 @@ + + + net6.0-windows10.0.17763.0 + 10.0.17763.0 + x64;x86;arm64 + AnyCPU + false + + + + true + true + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + Microsoft.Windows.Storage + 10.0.17763.0 + false + + + + + pdbonly + true + + + + + + + + + + + + + $(OutDir)..\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.ApplicationModel.DynamicDependency.winmd + true + + + $(OutDir)..\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.Storage.winmd + true + + + + diff --git a/specs/applicationdata/ApplicationData.md b/specs/applicationdata/ApplicationData.md index 9dfcfdb280..20ad407f4c 100644 --- a/specs/applicationdata/ApplicationData.md +++ b/specs/applicationdata/ApplicationData.md @@ -270,7 +270,7 @@ If you need this functionality use the OS APIs in `Windows.Storage.ApplicationDa ```c# (but really MIDL3) namespace Microsoft.Windows.Storage { - [contractversion(1)] + [contractversion(2)] apicontract ApplicationDataContract{}; /// Specifies the type of data store. @@ -350,6 +350,8 @@ namespace Microsoft.Windows.Storage static ApplicationData GetForPackageFamily(String packageFamilyName); /// Get an instance of ApplicationData for the specified unpackaged app for the current user. + [feature(Feature_ApplicationData)] + [contract(ApplicationDataContract, 2)] static ApplicationData GetForUnpackaged(String publisher, String product); /// Return true if the package family supports the machine data store.