Skip to content

Commit 659be67

Browse files
committed
Add COM for EditPackageCatalog
1 parent 98d972b commit 659be67

19 files changed

Lines changed: 352 additions & 6 deletions

File tree

src/AppInstallerCLICore/Commands/SourceCommand.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ namespace AppInstaller::CLI
124124

125125
struct SourceEditCommand final : public Command
126126
{
127-
SourceEditCommand(std::string_view parent) : Command("edit", { "config" }, parent, Settings::ExperimentalFeature::Feature::SourceEdit) {}
127+
SourceEditCommand(std::string_view parent) : Command("edit", { "config", "set" }, parent, Settings::ExperimentalFeature::Feature::SourceEdit) {}
128128

129129
std::vector<Argument> GetArguments() const override;
130130

src/AppInstallerCLIE2ETests/Interop/PackageCatalogInterop.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,63 @@ public async Task RemoveNonExistingPackageCatalog()
254254
await this.RemoveAndValidatePackageCatalogAsync(removePackageCatalogOptions, RemovePackageCatalogStatus.InvalidOptions, Constants.ErrorCode.ERROR_SOURCE_NAME_DOES_NOT_EXIST);
255255
}
256256

257+
/// <summary>
258+
/// Edit package catalog with invalid options.
259+
/// </summary>
260+
[Test]
261+
public void EditPackageCatalogWithInvalidOptions()
262+
{
263+
// Edit package catalog with null options.
264+
Assert.Throws<NullReferenceException>(() => this.packageManager.EditPackageCatalog(null));
265+
266+
// Edit package catalog with empty options.
267+
Assert.Throws<ArgumentException>(() => this.packageManager.EditPackageCatalog(this.TestFactory.CreateEditPackageCatalogOptions()));
268+
}
269+
270+
/// <summary>
271+
/// Edit a package catalog that is not present.
272+
/// </summary>
273+
[Test]
274+
public void EditNonExistingPackageCatalog()
275+
{
276+
EditPackageCatalogOptions editPackageCatalogOptions = this.TestFactory.CreateEditPackageCatalogOptions();
277+
editPackageCatalogOptions.Name = Constants.TestSourceName;
278+
279+
this.EditAndValidatePackageCatalog(editPackageCatalogOptions, EditPackageCatalogStatus.InvalidOptions, Constants.ErrorCode.ERROR_SOURCE_NAME_DOES_NOT_EXIST);
280+
}
281+
282+
/// <summary>
283+
/// Edit a package catalog that is not present.
284+
/// </summary>
285+
/// <returns>representing the asynchronous unit test.</returns>
286+
[Test]
287+
public async Task AddEditRemovePackageCatalog()
288+
{
289+
// Add
290+
AddPackageCatalogOptions options = this.TestFactory.CreateAddPackageCatalogOptions();
291+
options.SourceUri = Constants.TestSourceUrl;
292+
options.Name = Constants.TestSourceName;
293+
options.TrustLevel = PackageCatalogTrustLevel.Trusted;
294+
295+
await this.AddAndValidatePackageCatalogAsync(options, AddPackageCatalogStatus.Ok);
296+
297+
// Edit
298+
EditPackageCatalogOptions editOptions = this.TestFactory.CreateEditPackageCatalogOptions();
299+
editOptions.Name = Constants.TestSourceName;
300+
editOptions.Explicit = "false";
301+
this.EditAndValidatePackageCatalog(editOptions, EditPackageCatalogStatus.Ok);
302+
303+
// Remove
304+
RemovePackageCatalogOptions removePackageCatalogOptions = this.TestFactory.CreateRemovePackageCatalogOptions();
305+
removePackageCatalogOptions.Name = Constants.TestSourceName;
306+
var removeCatalogResult = await this.packageManager.RemovePackageCatalogAsync(removePackageCatalogOptions);
307+
Assert.IsNotNull(removeCatalogResult);
308+
Assert.AreEqual(RemovePackageCatalogStatus.Ok, removeCatalogResult.Status);
309+
310+
var testSource = this.packageManager.GetPackageCatalogByName(Constants.TestSourceName);
311+
Assert.IsNull(testSource);
312+
}
313+
257314
/// <summary>
258315
/// Test class Tear down.
259316
/// </summary>
@@ -324,5 +381,22 @@ private async Task RemoveAndValidatePackageCatalogAsync(RemovePackageCatalogOpti
324381
var packageCatalog = this.packageManager.GetPackageCatalogByName(removePackageCatalogOptions.Name);
325382
Assert.IsNull(packageCatalog);
326383
}
384+
385+
private void EditAndValidatePackageCatalog(EditPackageCatalogOptions editPackageCatalogOptions, EditPackageCatalogStatus expectedStatus, int expectedErrorCode = 0)
386+
{
387+
var editCatalogResult = this.packageManager.EditPackageCatalog(editPackageCatalogOptions);
388+
Assert.IsNotNull(editCatalogResult);
389+
Assert.AreEqual(expectedStatus, editCatalogResult.Status);
390+
391+
if (expectedStatus != EditPackageCatalogStatus.Ok && expectedErrorCode != 0)
392+
{
393+
Assert.AreEqual(expectedErrorCode, editCatalogResult.ExtendedErrorCode.HResult);
394+
return;
395+
}
396+
397+
// Verify edits are correct.
398+
var packageCatalog = this.packageManager.GetPackageCatalogByName(editPackageCatalogOptions.Name);
399+
Assert.AreEqual(packageCatalog.Info.Explicit, bool.Parse(editPackageCatalogOptions.Explicit));
400+
}
327401
}
328402
}

src/Microsoft.Management.Deployment.InProc/Microsoft.Management.Deployment.InProc.dll.manifest

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,9 @@
5555
clsid="{1125D3A6-E2CE-479A-91D5-71A3F6F8B00B}"
5656
threadingModel="Both"
5757
description="RemovePackageCatalogOptions"/>
58+
<comClass
59+
clsid="{E8E12FE1-AB77-40C4-A562-E91FB51B4E82}"
60+
threadingModel="Both"
61+
description="EditPackageCatalogOptions"/>
5862
</file>
5963
</assembly>

src/Microsoft.Management.Deployment.OutOfProc/Factory.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace Microsoft::Management::Deployment::OutOfProc
2424
constexpr CLSID CLSID_RepairOptions = { 0x0498F441, 0x3097, 0x455F, { 0x9C, 0xAF, 0x14, 0x8F, 0x28, 0x29, 0x38, 0x65 } }; //0498F441-3097-455F-9CAF-148F28293865
2525
constexpr CLSID CLSID_AddPackageCatalogOptions = { 0xDB9D012D, 0x00D7, 0x47EE, { 0x8F, 0xB1, 0x60, 0x6E, 0x10, 0xAC, 0x4F, 0x51 } }; //DB9D012D-00D7-47EE-8FB1-606E10AC4F51
2626
constexpr CLSID CLSID_RemovePackageCatalogOptions = { 0x032B1C58, 0xB975, 0x469B, { 0xA0, 0x13, 0xE6, 0x32, 0xB6, 0xEC, 0xE8, 0xD8 } }; //032B1C58-B975-469B-A013-E632B6ECE8D8
27+
constexpr CLSID CLSID_EditPackageCatalogOptions = { 0xA9F5E736, 0x68CE, 0x463C, { 0xBA, 0x6D, 0xDE, 0x96, 0x8F, 0x0C, 0xCE, 0x04 } }; //A9F5E736-68CE-463C-BA6D-DE968F0CCE04
2728
#else
2829
constexpr CLSID CLSID_PackageManager = { 0x74CB3139, 0xB7C5, 0x4B9E, { 0x93, 0x88, 0xE6, 0x61, 0x6D, 0xEA, 0x28, 0x8C } }; //74CB3139-B7C5-4B9E-9388-E6616DEA288C
2930
constexpr CLSID CLSID_InstallOptions = { 0x44FE0580, 0x62F7, 0x44D4, { 0x9E, 0x91, 0xAA, 0x96, 0x14, 0xAB, 0x3E, 0x86 } }; //44FE0580-62F7-44D4-9E91-AA9614AB3E86
@@ -36,6 +37,7 @@ namespace Microsoft::Management::Deployment::OutOfProc
3637
constexpr CLSID CLSID_RepairOptions = { 0xE62BB1E7, 0xC7B2, 0x4AEC, { 0x9E, 0x28, 0xFB, 0x64, 0x9B, 0x30, 0xFF, 0x03 } }; //E62BB1E7-C7B2-4AEC-9E28-FB649B30FF03
3738
constexpr CLSID CLSID_AddPackageCatalogOptions = { 0xD58C7E4C, 0x70E6, 0x476C, { 0xA5, 0xD4, 0x80, 0x34, 0x1E, 0xD8, 0x02, 0x52 } }; //D58C7E4C-70E6-476C-A5D4-80341ED80252
3839
constexpr CLSID CLSID_RemovePackageCatalogOptions = { 0x87A96609, 0x1A39, 0x4955, { 0xBE, 0x72, 0x71, 0x74, 0xE1, 0x47, 0xB7, 0xDC } }; //87A96609-1A39-4955-BE72-7174E147B7DC
40+
constexpr CLSID CLSID_EditPackageCatalogOptions = { 0x29B19238, 0x81AD, 0x4A8E, { 0xA2, 0xFC, 0xAD, 0xF1, 0x7C, 0x38, 0xCA, 0xEB } }; //29B19238-81AD-4A8E-A2FC-ADF17C38CAEB
3941

4042
#endif
4143

@@ -45,7 +47,7 @@ namespace Microsoft::Management::Deployment::OutOfProc
4547
GUID CLSID;
4648
};
4749

48-
constexpr std::array<NameCLSIDPair, 11> s_nameCLSIDPairs
50+
constexpr std::array<NameCLSIDPair, 12> s_nameCLSIDPairs
4951
{
5052
NameCLSIDPair{ L"Microsoft.Management.Deployment.PackageManager"sv, CLSID_PackageManager },
5153
NameCLSIDPair{ L"Microsoft.Management.Deployment.InstallOptions"sv, CLSID_InstallOptions },
@@ -58,6 +60,7 @@ namespace Microsoft::Management::Deployment::OutOfProc
5860
NameCLSIDPair{ L"Microsoft.Management.Deployment.RepairOptions"sv, CLSID_RepairOptions },
5961
NameCLSIDPair{ L"Microsoft.Management.Deployment.AddPackageCatalogOptions"sv, CLSID_AddPackageCatalogOptions },
6062
NameCLSIDPair{ L"Microsoft.Management.Deployment.RemovePackageCatalogOptions"sv, CLSID_RemovePackageCatalogOptions },
63+
NameCLSIDPair{ L"Microsoft.Management.Deployment.EditPackageCatalogOptions"sv, CLSID_EditPackageCatalogOptions },
6164
};
6265

6366
bool IsCLSIDPresent(const GUID& clsid)

src/Microsoft.Management.Deployment.Projection/ClassesDefinition.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,18 @@ internal static class ClassesDefinition
150150
[ClsidContext.OutOfProc] = new Guid("032B1C58-B975-469B-A013-E632B6ECE8D8"),
151151
[ClsidContext.OutOfProcDev] = new Guid("87A96609-1A39-4955-BE72-7174E147B7DC"),
152152
}
153+
},
154+
155+
[typeof(EditPackageCatalogOptions)] = new()
156+
{
157+
ProjectedClassType = typeof(EditPackageCatalogOptions),
158+
InterfaceType = typeof(IEditPackageCatalogOptions),
159+
Clsids = new Dictionary<ClsidContext, Guid>()
160+
{
161+
[ClsidContext.InProc] = new Guid("E8E12FE1-AB77-40C4-A562-E91FB51B4E82"),
162+
[ClsidContext.OutOfProc] = new Guid("A9F5E736-68CE-463C-BA6D-DE968F0CCE04"),
163+
[ClsidContext.OutOfProcDev] = new Guid("29B19238-81AD-4A8E-A2FC-ADF17C38CAEB"),
164+
}
153165
}
154166
};
155167

src/Microsoft.Management.Deployment.Projection/WinGetProjectionFactory.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public WinGetProjectionFactory(IInstanceInitializer instanceInitializer)
3939

4040
public AddPackageCatalogOptions CreateAddPackageCatalogOptions() => InstanceInitializer.CreateInstance<AddPackageCatalogOptions>();
4141

42-
public RemovePackageCatalogOptions CreateRemovePackageCatalogOptions() => InstanceInitializer.CreateInstance<RemovePackageCatalogOptions>();
42+
public RemovePackageCatalogOptions CreateRemovePackageCatalogOptions() => InstanceInitializer.CreateInstance<RemovePackageCatalogOptions>();
43+
44+
public EditPackageCatalogOptions CreateEditPackageCatalogOptions() => InstanceInitializer.CreateInstance<EditPackageCatalogOptions>();
4345
}
4446
}

src/Microsoft.Management.Deployment/ComClsids.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "RepairOptions.h"
1818
#include "AddPackageCatalogOptions.h"
1919
#include "RemovePackageCatalogOptions.h"
20+
#include "EditPackageCatalogOptions.h"
2021
#pragma warning( pop )
2122

2223
namespace winrt::Microsoft::Management::Deployment
@@ -70,6 +71,10 @@ namespace winrt::Microsoft::Management::Deployment
7071
else if (IsEqualCLSID(clsid, WINGET_INPROC_COM_CLSID_RemovePackageCatalogOptions))
7172
{
7273
return __uuidof(winrt::Microsoft::Management::Deployment::implementation::RemovePackageCatalogOptions);
74+
}
75+
else if (IsEqualCLSID(clsid, WINGET_INPROC_COM_CLSID_EditPackageCatalogOptions))
76+
{
77+
return __uuidof(winrt::Microsoft::Management::Deployment::implementation::EditPackageCatalogOptions);
7378
}
7479
else
7580
{

src/Microsoft.Management.Deployment/Converters.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,19 @@ namespace winrt::Microsoft::Management::Deployment::implementation
530530
}
531531
}
532532

533+
EditPackageCatalogStatus GetEditPackageCatalogOperationStatus(winrt::hresult hresult)
534+
{
535+
switch (hresult)
536+
{
537+
case APPINSTALLER_CLI_ERROR_SOURCE_NAME_DOES_NOT_EXIST:
538+
return EditPackageCatalogStatus::InvalidOptions;
539+
case APPINSTALLER_CLI_ERROR_INVALID_SOURCE_TYPE:
540+
return EditPackageCatalogStatus::CatalogError;
541+
default:
542+
return HandleCommonCatalogOperationStatus<EditPackageCatalogStatus>(hresult);
543+
}
544+
}
545+
533546
::AppInstaller::Manifest::PlatformEnum GetPlatformEnum(WindowsPlatform value)
534547
{
535548
switch (value)

src/Microsoft.Management.Deployment/Converters.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ namespace winrt::Microsoft::Management::Deployment::implementation
3333
::AppInstaller::Manifest::ScopeEnum GetManifestRepairScope(winrt::Microsoft::Management::Deployment::PackageRepairScope scope);
3434
winrt::Microsoft::Management::Deployment::AddPackageCatalogStatus GetAddPackageCatalogOperationStatus(winrt::hresult hresult);
3535
winrt::Microsoft::Management::Deployment::RemovePackageCatalogStatus GetRemovePackageCatalogOperationStatus(winrt::hresult hresult);
36+
winrt::Microsoft::Management::Deployment::EditPackageCatalogStatus GetEditPackageCatalogOperationStatus(winrt::hresult hresult);
3637
::AppInstaller::Manifest::PlatformEnum GetPlatformEnum(winrt::Microsoft::Management::Deployment::WindowsPlatform value);
3738

3839
#define WINGET_GET_OPERATION_RESULT_STATUS(_installResultStatus_, _uninstallResultStatus_, _downloadResultStatus_, _repairResultStatus_) \
@@ -194,6 +195,10 @@ namespace winrt::Microsoft::Management::Deployment::implementation
194195
{
195196
return HandleCommonCatalogOperationStatus<RefreshPackageCatalogStatus>(hresult);
196197
}
198+
else if constexpr (std::is_same_v<TStatus, winrt::Microsoft::Management::Deployment::EditPackageCatalogStatus>)
199+
{
200+
return GetEditPackageCatalogOperationStatus(hresult);
201+
}
197202
else
198203
{
199204
throw winrt::hresult_error(E_UNEXPECTED);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
#include "pch.h"
4+
#pragma warning( push )
5+
#pragma warning ( disable : 4467 6388)
6+
// 6388 Allow CreateInstance.
7+
#include <wil\cppwinrt_wrl.h>
8+
// 4467 Allow use of uuid attribute for com object creation.
9+
#include "EditPackageCatalogOptions.h"
10+
#pragma warning( pop )
11+
#include "EditPackageCatalogOptions.g.cpp"
12+
#include "Converters.h"
13+
#include "Helpers.h"
14+
15+
namespace winrt::Microsoft::Management::Deployment::implementation
16+
{
17+
hstring EditPackageCatalogOptions::Name()
18+
{
19+
return hstring(m_name);
20+
}
21+
void EditPackageCatalogOptions::Name(hstring const& value)
22+
{
23+
m_name = value;
24+
}
25+
hstring EditPackageCatalogOptions::Explicit()
26+
{
27+
return hstring(m_explicit);
28+
}
29+
void EditPackageCatalogOptions::Explicit(hstring const& value)
30+
{
31+
m_explicit = value;
32+
}
33+
34+
CoCreatableMicrosoftManagementDeploymentClass(EditPackageCatalogOptions);
35+
}

0 commit comments

Comments
 (0)