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 }