Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PackageDeploymentManager/PackageRuntimeManager v0 (experimental) #3820

Merged
merged 46 commits into from
Sep 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
4fa323a
Manually update DevChcek (awaiting Maestro to automate that thing it'…
DrusTheAxe Jul 17, 2023
3909421
Fix compile rwarnings
DrusTheAxe Jul 17, 2023
5a30b9c
Fixed warning
DrusTheAxe Jul 17, 2023
1b68775
Start of Package*Manager
DrusTheAxe Jul 29, 2023
c856448
Added missing build dependency
DrusTheAxe Jul 29, 2023
f0b002a
Got the .idl and project working. Got the c++/winrt generated sources…
DrusTheAxe Jul 30, 2023
e2f602c
Added PackageVolume. Start of implementations
DrusTheAxe Jul 31, 2023
61df35c
Shuffled some code and added comments for clarity
DrusTheAxe Jul 31, 2023
64e7460
Added PAckageVolumeManager and PackageVolumeStatus. Partial PackageVo…
DrusTheAxe Aug 8, 2023
275116a
Added missing change
DrusTheAxe Aug 10, 2023
c3ea279
Moar implementation progress
DrusTheAxe Aug 13, 2023
e3cac0e
Implemented most of IsReady
DrusTheAxe Aug 13, 2023
7eb393c
Update TAEF from 10.75.221207001 to 10.82.230714001. Update C++/WinRT…
DrusTheAxe Aug 15, 2023
00f112c
Moar implementation
DrusTheAxe Aug 18, 2023
cab1589
Added PackageManagerTests skeleton
DrusTheAxe Aug 18, 2023
34d2b20
Added PackageMangerTests
DrusTheAxe Aug 19, 2023
fe4ba6b
Added PackageManagerTests to the solution. Additional fixes and some …
DrusTheAxe Aug 19, 2023
38404e3
Added new types to test package
DrusTheAxe Aug 19, 2023
1a01475
Vectors need instances
DrusTheAxe Aug 19, 2023
b09b32e
Fixed some vector declarations
DrusTheAxe Aug 19, 2023
c495e45
Fixed some build dependencies
DrusTheAxe Aug 19, 2023
0430ca3
Fixes found from testing
DrusTheAxe Aug 19, 2023
591ea8b
Added test package
DrusTheAxe Aug 22, 2023
a3ec4a5
IsReady tests work!
DrusTheAxe Aug 22, 2023
a96920e
Added tests for EnsureIsReadyAsync. Mostly working; 1 last to verify
DrusTheAxe Aug 23, 2023
7db75ef
Added more options and overloads to round out the design and fill in …
DrusTheAxe Aug 25, 2023
bedc414
More name fixups
DrusTheAxe Aug 25, 2023
abae87c
Fixed! All tests passing!
DrusTheAxe Aug 25, 2023
a40e998
Added the missing IsRegistered property. More implementation. More te…
DrusTheAxe Aug 26, 2023
1ffb5b0
Added more tests. Added TerminalVelocity support. Incorporated feedback
DrusTheAxe Aug 27, 2023
383d11b
Incorporated feedback. Fixed up tests.
DrusTheAxe Aug 27, 2023
9101d8d
Tests weren't setting PackageSetItem.MinVersion
DrusTheAxe Aug 27, 2023
9f1298a
Fixed tests. All now pass!
DrusTheAxe Aug 27, 2023
80df7e7
Started implementation of PackageRuntimeResolver. Added architecture …
DrusTheAxe Aug 28, 2023
d373de5
Merge branch 'develop' into user/drustheaxe/pkgmgr
DrusTheAxe Aug 28, 2023
d45d541
Remove trailing comma
DrusTheAxe Aug 29, 2023
08fd77b
Incorporated feedback
DrusTheAxe Aug 31, 2023
2718ae2
Merge branch 'user/drustheaxe/pkgmgr' of https://github.com/microsoft…
DrusTheAxe Aug 31, 2023
c6e2dd2
Something weird's failing in the ARM64 tests. Disabling ARM64 tempora…
DrusTheAxe Sep 1, 2023
7267426
Added most of PackageRuntimeManager. There's a chicken/egg problem ab…
DrusTheAxe Sep 1, 2023
4335ad2
Removed dead code
DrusTheAxe Sep 1, 2023
d98ac78
Moar tests
DrusTheAxe Sep 4, 2023
706e82a
Changed PackageRuntimeManager.Add* to return results (needed if you w…
DrusTheAxe Sep 4, 2023
eb281cc
Added PackageRuntimeMAnager.RemovePackageSet(). Fixed Runtime tests t…
DrusTheAxe Sep 4, 2023
6b43ea6
Merge branch 'develop' into user/drustheaxe/pkgmgr
DrusTheAxe Sep 4, 2023
ec37ea6
Fixed some tests error code check
DrusTheAxe Sep 4, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 167 additions & 0 deletions WindowsAppRuntime.sln

Large diffs are not rendered by default.

136 changes: 135 additions & 1 deletion dev/Common/AppModel.Identity.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
// Copyright (c) Microsoft Corporation and Contributors.
// Copyright (c) Microsoft Corporation and Contributors.
// Licensed under the MIT License.

#ifndef __APPMODEL_IDENTITY_H
#define __APPMODEL_IDENTITY_H

#include <appmodel.h>

#include <memory>
#include <stdint.h>

namespace AppModel::Identity
{
inline bool IsPackagedProcess()
Expand Down Expand Up @@ -46,6 +49,34 @@ constexpr PCWSTR GetCurrentArchitectureAsString()
#endif
}

constexpr PCWSTR GetArchitectureAsString(const std::uint32_t architecture)
{
switch (architecture)
{
case PROCESSOR_ARCHITECTURE_AMD64: return L"x64";
case PROCESSOR_ARCHITECTURE_ARM: return L"arm";
case PROCESSOR_ARCHITECTURE_ARM64: return L"arm64";
case PROCESSOR_ARCHITECTURE_IA32_ON_ARM64: return L"x86onArm64";
case PROCESSOR_ARCHITECTURE_INTEL: return L"x86";
case PROCESSOR_ARCHITECTURE_NEUTRAL: return L"neutral";
case PROCESSOR_ARCHITECTURE_UNKNOWN: return L"unknown";
default: THROW_HR_MSG(E_UNEXPECTED, "Unknown architecture 0x%X", architecture);
}
}

constexpr PCWSTR GetArchitectureAsString(const winrt::Windows::System::ProcessorArchitecture architecture)
{
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Arm) == static_cast<int>(PROCESSOR_ARCHITECTURE_ARM), "winrt::Windows::System::ProcessorArchitecture::Arm != PROCESSOR_ARCHITECTURE_ARM");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Arm64) == static_cast<int>(PROCESSOR_ARCHITECTURE_ARM64), "winrt::Windows::System::ProcessorArchitecture::Arm64 != PROCESSOR_ARCHITECTURE_ARM64");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Neutral) == static_cast<int>(PROCESSOR_ARCHITECTURE_NEUTRAL), "winrt::Windows::System::ProcessorArchitecture::Neutral != PROCESSOR_ARCHITECTURE_NEUTRAL");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Unknown) == static_cast<int>(PROCESSOR_ARCHITECTURE_UNKNOWN), "winrt::Windows::System::ProcessorArchitecture::Unknown != PROCESSOR_ARCHITECTURE_UNKNOWN");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::X64) == static_cast<int>(PROCESSOR_ARCHITECTURE_AMD64), "winrt::Windows::System::ProcessorArchitecture::X64 != PROCESSOR_ARCHITECTURE_AMD64");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::X86) == static_cast<int>(PROCESSOR_ARCHITECTURE_INTEL), "winrt::Windows::System::ProcessorArchitecture::X86 != PROCESSOR_ARCHITECTURE_INTEL");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::X86OnArm64) == static_cast<int>(PROCESSOR_ARCHITECTURE_IA32_ON_ARM64), "winrt::Windows::System::ProcessorArchitecture::X86OnArm64 != PROCESSOR_ARCHITECTURE_IA32_ON_ARM64");

return GetArchitectureAsString(static_cast<std::uint32_t>(architecture));
}

inline winrt::Windows::System::ProcessorArchitecture ParseArchitecture(_In_ PCWSTR architecture)
{
if (CompareStringOrdinal(architecture, -1, L"x64", -1, TRUE) == CSTR_EQUAL)
Expand Down Expand Up @@ -109,6 +140,109 @@ inline winrt::Windows::System::ProcessorArchitecture ParseShortArchitecture(_In_
}
}

class PackageVersion : public PACKAGE_VERSION
{
public:
PackageVersion(const PackageVersion&) = default;

// Create an instance with the value `major.minor.build.revision`.
PackageVersion(std::uint16_t major, std::uint16_t minor = 0, std::uint16_t build = 0, std::uint16_t revision = 0) :
PACKAGE_VERSION()
{
Major = major;
Minor = minor;
Build = build;
Revision = revision;
}

// Create an instance from a version as a uint64.
PackageVersion(std::uint64_t version = 0)
{
Version = version;
}

template<typename TVersion>
PackageVersion(TVersion const& t) :
PackageVersion(t.Major, t.Minor, t.Build, t.Revision)
{
}

#if defined(WINRT_Windows_ApplicationModel_2_H)
PackageVersion(winrt::Windows::ApplicationModel::PackageVersion packageVersion) :
PACKAGE_VERSION()
{
Major = packageVersion.Major;
Minor = packageVersion.Minor;
Build = packageVersion.Build;
Revision = packageVersion.Revision;
}
#endif // defined(WINRT_Windows_ApplicationModel_2_H)

PackageVersion& operator=(const PackageVersion&) = default;

// Return the version as a uint64.
std::uint64_t ToVersion() const
{
return Version;
}

#if defined(____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__)
ABI::Windows::ApplicationModel::PackageVersion ToPackageVersion() const
{
return ABI::Windows::ApplicationModel::PackageVersion{ Major, Minor, Build, Revision };
}
#endif // defined(____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__)

#if defined(WINRT_Windows_ApplicationModel_2_H)
winrt::Windows::ApplicationModel::PackageVersion ToWinrtPackageVersion() const
{
return winrt::Windows::ApplicationModel::PackageVersion{ Major, Minor, Build, Revision };
}
#endif // defined(WINRT_Windows_ApplicationModel_2_H)

#if defined(_XSTRING_)
// Return the string as a formatted value "major.minor.build.revision".
std::wstring ToString() const
{
return ToString(Major, Minor, Build, Revision);
}

static std::wstring ToString(std::uint16_t major, std::uint16_t minor, std::uint16_t build, std::uint16_t revision)
{
#if (__cplusplus >= 202002L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
return std::format(L"{}.{}.{}.{}", major, minor, build, revision);
#else
return std::to_wstring(major) + L"." + std::to_wstring(minor) + L"." + std::to_wstring(build) + L"." + std::to_wstring(revision);
#endif
}
#endif defined(_XSTRING_)
};

inline bool operator==(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version == packageVersion2.Version;
}
inline bool operator!=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version != packageVersion2.Version;
}
inline bool operator<(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version < packageVersion2.Version;
}
inline bool operator<=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version <= packageVersion2.Version;
}
inline bool operator>(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version > packageVersion2.Version;
}
inline bool operator>=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version >= packageVersion2.Version;
}

inline bool IsValidVersionShortTag(
const std::wstring& versionShortTag)
{
Expand Down
29 changes: 28 additions & 1 deletion dev/Common/AppModel.Package.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// Copyright (c) Microsoft Corporation and Contributors.
// Copyright (c) Microsoft Corporation and Contributors.
// Licensed under the MIT License.

#ifndef __APPMODEL_PACKAGE_H
#define __APPMODEL_PACKAGE_H

#include <appmodel.h>

#include <AppModel.Identity.h>

namespace AppModel::Package
{
/// Find all Main+Framework packages in a package family registered to the current user
Expand Down Expand Up @@ -52,6 +54,31 @@ inline PACKAGE_VERSION ToPackageVersion(winrt::Windows::ApplicationModel::Packag
to.Revision = from.Revision;
return to;
}

inline std::tuple<std::wstring, PACKAGE_VERSION, std::uint32_t, std::wstring, std::wstring, std::wstring> ParsePackageFullName(PCWSTR packageFullName)
{
BYTE buffer[
sizeof(PACKAGE_ID) +
sizeof(WCHAR) * (PACKAGE_NAME_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_VERSION_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_ARCHITECTURE_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_RESOURCEID_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_PUBLISHERID_MAX_LENGTH + 1)]{};
UINT32 bufferLength{ ARRAYSIZE(buffer) };
THROW_IF_WIN32_ERROR_MSG(::PackageIdFromFullName(packageFullName, PACKAGE_INFORMATION_BASIC, &bufferLength, buffer), "%ls", packageFullName);
const auto& packageId{ *reinterpret_cast<PACKAGE_ID*>(buffer) };

WCHAR packageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{};
UINT32 packageFamilyNameLength{ ARRAYSIZE(packageFamilyName) };
THROW_IF_WIN32_ERROR_MSG(::PackageFamilyNameFromId(&packageId, &packageFamilyNameLength, packageFamilyName), "%ls", packageFullName);

return { std::wstring(packageId.name), packageId.version, packageId.processorArchitecture, std::wstring(packageId.resourceId ? packageId.resourceId : L""), std::wstring(packageId.publisherId), std::wstring(packageFamilyName) };
}

inline std::tuple<std::wstring, PACKAGE_VERSION, std::uint32_t, std::wstring, std::wstring, std::wstring> ParsePackageFullName(const std::wstring& packageFullName)
{
return ParsePackageFullName(packageFullName.c_str());
}
}

#endif // __APPMODEL_PACKAGE_H
32 changes: 32 additions & 0 deletions dev/Common/TerminalVelocityFeatures-PackageManager.h
Original file line number Diff line number Diff line change
@@ -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-PackageManager.xml
// OPTIONS: -Channel Experimental -Language C++ -Namespace Microsoft.Windows.Management.Deployment -Path dev\common\TerminalVelocityFeatures-PackageManager.xml -Output dev\common\TerminalVelocityFeatures-PackageManager.h

#if defined(__midlrt)
namespace features
{
feature_name Feature_PackageManager = { DisabledByDefault, FALSE };
}
#endif // defined(__midlrt)

// Feature constants
#define WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED 1

#if defined(__cplusplus)

namespace Microsoft::Windows::Management::Deployment
{

__pragma(detect_mismatch("ODR_violation_WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED_mismatch", "AlwaysEnabled"))
struct Feature_PackageManager
{
static constexpr bool IsEnabled() { return WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED == 1; }
};

} // namespace Microsoft.Windows.Management.Deployment

#endif // defined(__cplusplus)
20 changes: 20 additions & 0 deletions dev/Common/TerminalVelocityFeatures-PackageManager.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<features xmlns="http://microsoft.com/windowsappsdk/TerminalVelocity/20210729/TerminalVelocityFeatures.xsd">

<!-- Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the MIT License. See LICENSE in the project root for license information.
-->

<!-- See docs/TerminalVelocity.md for more info. -->

<!-- Enabled variants -->
<feature>
<name>Feature_PackageManager</name>
<description>Package Management APIs</description>
<state>AlwaysEnabled</state>
<alwaysDisabledChannelTokens>
<channelToken>Preview</channelToken>
<channelToken>Stable</channelToken>
</alwaysDisabledChannelTokens>
</feature>
</features>
2 changes: 1 addition & 1 deletion dev/DeploymentAgent/packages.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Windows.CppWinRT" version="2.0.221121.5" targetFramework="native" />
<package id="Microsoft.Windows.CppWinRT" version="2.0.230706.1" targetFramework="native" />
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.220914.1" targetFramework="native" />
</packages>
5 changes: 4 additions & 1 deletion dev/DynamicDependency/API/DynamicDependency.vcxitems
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<ClCompile Include="$(MSBuildThisFileDirectory)M.AM.DD.PackageDependencyRank.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddDetourPackageGraph.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddLifetimeManagement.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddWin11.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddWinRT.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MsixDynamicDependency.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)PackageDependency.cpp" />
Expand All @@ -46,6 +47,7 @@
<ClInclude Include="$(MSBuildThisFileDirectory)MddDetourPackageGraph.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddLifetimeManagement.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddLifetimeManagementTest.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddWin11.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddWinRT.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MsixDynamicDependency.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)M.AM.Converters.h" />
Expand All @@ -69,8 +71,9 @@
<PublicHeaders Include="$(MSBuildThisFileDirectory)appmodel_msixdynamicdependency.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MddLifetimeManagement.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MddLifetimeManagementTest.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MddWin11.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MsixDynamicDependency.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)..\..\common\TerminalVelocityFeatures-DynamicDependency.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)wil_msixdynamicdependency.h" />
</ItemGroup>
</Project>
</Project>
8 changes: 7 additions & 1 deletion dev/DynamicDependency/API/DynamicDependency.vcxitems.filters
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@
<ClCompile Include="$(MSBuildThisFileDirectory)DataStore.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)MddWin11.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)MddWinRT.cpp">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down Expand Up @@ -127,6 +130,9 @@
<ClInclude Include="$(MSBuildThisFileDirectory)DataStore.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)MddWin11.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)MddWinRT.h">
<Filter>Header Files</Filter>
</ClInclude>
Expand All @@ -152,4 +158,4 @@
<ItemGroup>
<Midl Include="$(MSBuildThisFileDirectory)M.AM.DynamicDependency.idl" />
</ItemGroup>
</Project>
</Project>
Loading