Package.cpp
 1  #include "Package.h"
 2  
 3  #include <Windows.h>
 4  
 5  #include <filesystem>
 6  #include <optional>
 7  #include <fstream>
 8  #include <sstream>
 9  #include <string>
10  
11  #include <winrt/Windows.Foundation.Collections.h>
12  #include <winrt/Windows.ApplicationModel.h>
13  #include <winrt/Windows.Foundation.h>
14  #include <winrt/Windows.Management.Deployment.h>
15  
16  std::optional<winrt::Windows::ApplicationModel::Package> GetPackage(std::wstring packageDisplayName)
17  {
18      using namespace winrt::Windows::Foundation;
19      using namespace winrt::Windows::Management::Deployment;
20  
21      PackageManager packageManager;
22  
23      for (auto const& package : packageManager.FindPackagesForUser({}))
24      {
25          const auto& packageFullName = std::wstring{ package.Id().FullName() };
26  
27          if (packageFullName.contains(packageDisplayName))
28          {
29              return { package };
30          }
31      }
32  
33      return std::nullopt;
34  }
35  
36  std::wstringstream GetPackageInfo(winrt::Windows::ApplicationModel::Package package) {
37      std::wstringstream packageInfo;
38      packageInfo << L"Display name: " << std::wstring(package.DisplayName()) << std::endl;
39      packageInfo << L"Full name: " << std::wstring(package.Id().FullName()) << std::endl;
40      packageInfo << L"Version: " << package.Id().Version().Major << L"."
41          << package.Id().Version().Minor << L"."
42          << package.Id().Version().Build << L"."
43          << package.Id().Version().Revision << L"." << std::endl;
44      packageInfo << L"Publisher: " << std::wstring(package.Id().Publisher()) << std::endl;
45      packageInfo << L"Status: " << (package.Status().VerifyIsOK() ? std::wstring(L"OK") : std::wstring(L"Not OK")) << std::endl;
46  
47      return packageInfo;
48  }
49  
50  void ReportInstalledContextMenuPackages(const std::filesystem::path& reportDir)
51  {
52      const wchar_t* ImageResizerContextMenuPackageDisplayName = L"ImageResizerContextMenu";
53      const wchar_t* PowerRenameContextMenuPackageDisplayName = L"PowerRenameContextMenu";
54  
55      auto reportPath = reportDir;
56      reportPath.append("context-menu-packages.txt");
57  
58      std::wofstream packagesReport(reportPath);
59  
60      try
61      {
62          auto imageResizerPackage = GetPackage(ImageResizerContextMenuPackageDisplayName);
63          if (imageResizerPackage)
64          {
65              packagesReport << GetPackageInfo(*imageResizerPackage).str() << std::endl;
66          }
67  
68          auto powerRenamePackage = GetPackage(PowerRenameContextMenuPackageDisplayName);
69          if (powerRenamePackage)
70          {
71              packagesReport << GetPackageInfo(*powerRenamePackage).str() << std::endl;
72          }
73      }
74      catch (...)
75      {
76          printf("Failed to report installed context menu packages");
77      }
78  }