From ce6e055e3b372c4c78e425e39b6f0289514a0fa9 Mon Sep 17 00:00:00 2001 From: Dinah Gao <116714259+DinahK-2SO@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:08:25 +0800 Subject: [PATCH 01/14] validate the enums --- dev/Interop/StoragePickers/FileOpenPicker.cpp | 2 ++ dev/Interop/StoragePickers/FileSavePicker.cpp | 1 + dev/Interop/StoragePickers/FolderPicker.cpp | 2 ++ .../Microsoft.Windows.Storage.Pickers.idl | 3 +- dev/Interop/StoragePickers/PickerCommon.cpp | 35 +++++++++++++++++-- dev/Interop/StoragePickers/PickerCommon.h | 3 ++ .../Microsoft.Windows.Storage.Pickers.md | 1 - specs/StoragePickers/PickerLocationId.md | 8 ----- 8 files changed, 41 insertions(+), 14 deletions(-) diff --git a/dev/Interop/StoragePickers/FileOpenPicker.cpp b/dev/Interop/StoragePickers/FileOpenPicker.cpp index 9412982353..5f5c2ed48c 100644 --- a/dev/Interop/StoragePickers/FileOpenPicker.cpp +++ b/dev/Interop/StoragePickers/FileOpenPicker.cpp @@ -28,6 +28,7 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation } void FileOpenPicker::ViewMode(winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode const& value) { + PickerCommon::ValidateViewMode(value); m_viewMode = value; } hstring FileOpenPicker::SettingsIdentifier() @@ -44,6 +45,7 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation } void FileOpenPicker::SuggestedStartLocation(winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId const& value) { + PickerCommon::ValidateSuggestedStartLocation(value); m_suggestedStartLocation = value; } winrt::hstring FileOpenPicker::CommitButtonText() diff --git a/dev/Interop/StoragePickers/FileSavePicker.cpp b/dev/Interop/StoragePickers/FileSavePicker.cpp index 5af869dd72..d14e4cf37d 100644 --- a/dev/Interop/StoragePickers/FileSavePicker.cpp +++ b/dev/Interop/StoragePickers/FileSavePicker.cpp @@ -41,6 +41,7 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation } void FileSavePicker::SuggestedStartLocation(winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId const& value) { + PickerCommon::ValidateSuggestedStartLocation(value); m_suggestedStartLocation = value; } hstring FileSavePicker::CommitButtonText() diff --git a/dev/Interop/StoragePickers/FolderPicker.cpp b/dev/Interop/StoragePickers/FolderPicker.cpp index 6d38c058e0..472c17328e 100644 --- a/dev/Interop/StoragePickers/FolderPicker.cpp +++ b/dev/Interop/StoragePickers/FolderPicker.cpp @@ -26,6 +26,7 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation } void FolderPicker::ViewMode(winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode const& value) { + PickerCommon::ValidateViewMode(value); m_viewMode = value; } hstring FolderPicker::SettingsIdentifier() @@ -42,6 +43,7 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation } void FolderPicker::SuggestedStartLocation(winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId const& value) { + PickerCommon::ValidateSuggestedStartLocation(value); m_suggestedStartLocation = value; } hstring FolderPicker::CommitButtonText() diff --git a/dev/Interop/StoragePickers/Microsoft.Windows.Storage.Pickers.idl b/dev/Interop/StoragePickers/Microsoft.Windows.Storage.Pickers.idl index 6cfee3d9d2..3712b6cbec 100644 --- a/dev/Interop/StoragePickers/Microsoft.Windows.Storage.Pickers.idl +++ b/dev/Interop/StoragePickers/Microsoft.Windows.Storage.Pickers.idl @@ -23,8 +23,7 @@ namespace Microsoft.Windows.Storage.Pickers ComputerFolder, Desktop, Downloads, - HomeGroup, - MusicLibrary, + MusicLibrary = 5, PicturesLibrary, VideosLibrary, Objects3D, diff --git a/dev/Interop/StoragePickers/PickerCommon.cpp b/dev/Interop/StoragePickers/PickerCommon.cpp index a4b3b31d53..ca3af402e4 100644 --- a/dev/Interop/StoragePickers/PickerCommon.cpp +++ b/dev/Interop/StoragePickers/PickerCommon.cpp @@ -56,9 +56,6 @@ namespace { case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::Downloads: knownFolderId = FOLDERID_Downloads; break; - case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::HomeGroup: - knownFolderId = FOLDERID_HomeGroup; - break; case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::MusicLibrary: knownFolderId = FOLDERID_MusicLibrary; break; @@ -148,6 +145,38 @@ namespace PickerCommon { return { nullptr, L""}; } + void ValidateViewMode(winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode const& value) + { + switch (value) + { + case winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode::List: + case winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode::Thumbnail: + default: + // TODO to xiaomgao: localization + throw winrt::hresult_invalid_argument(L"IDS_APIERROR_INVALIDVIEWMODEVALUE"); + } + } + + void ValidateSuggestedStartLocation(winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId const& value) + { + switch (value) + { + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::DocumentsLibrary: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::ComputerFolder: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::Desktop: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::Downloads: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::MusicLibrary: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::PicturesLibrary: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::VideosLibrary: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::Objects3D: + case winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId::Unspecified: + return; + default: + // TODO to xiaomgao: localization + throw winrt::hresult_invalid_argument(L"IDS_APIERROR_INVALIDSUGGESTEDSTARTLOCATIONVALUE"); + } + } + winrt::hstring PickerParameters::FormatExtensionWithWildcard(winrt::hstring extension) { if (!extension.empty() && extension[0] == L'*') diff --git a/dev/Interop/StoragePickers/PickerCommon.h b/dev/Interop/StoragePickers/PickerCommon.h index 43fc633c5b..a50ee318e8 100644 --- a/dev/Interop/StoragePickers/PickerCommon.h +++ b/dev/Interop/StoragePickers/PickerCommon.h @@ -17,6 +17,9 @@ namespace PickerCommon { std::pair, std::wstring> ParseFolderItemAndFileName(winrt::hstring const& filePath); + void ValidateViewMode(winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode const& value); + void ValidateSuggestedStartLocation(winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId const& value); + struct PickerParameters { HWND HWnd{}; winrt::hstring CommitButtonText; diff --git a/specs/StoragePickers/Microsoft.Windows.Storage.Pickers.md b/specs/StoragePickers/Microsoft.Windows.Storage.Pickers.md index 211e1000f1..713216790f 100644 --- a/specs/StoragePickers/Microsoft.Windows.Storage.Pickers.md +++ b/specs/StoragePickers/Microsoft.Windows.Storage.Pickers.md @@ -53,7 +53,6 @@ namespace Microsoft.Windows.Storage.Pickers ComputerFolder = 1, Desktop = 2, Downloads = 3, - HomeGroup = 4, // Will be removed in future. MusicLibrary = 5, PicturesLibrary = 6, VideosLibrary = 7, diff --git a/specs/StoragePickers/PickerLocationId.md b/specs/StoragePickers/PickerLocationId.md index 79d51189cb..af4d6303a7 100644 --- a/specs/StoragePickers/PickerLocationId.md +++ b/specs/StoragePickers/PickerLocationId.md @@ -13,7 +13,6 @@ Namespace: [Microsoft.Windows.Storage.Pickers](./Microsoft.Windows.Storage.Picke | ComputerFolder | 1 | [This PC](#pickerlocationidcomputerfolder) | | Desktop | 2 | [The Desktop](#pickerlocationiddesktop) | | Downloads | 3 | [The Downloads folder](#pickerlocationiddownloads) | -| HomeGroup | 4 | [The HomeGroup folder will be removed in future, (avoid using this)](#pickerlocationidhomegroup) | | MusicLibrary | 5 | [The Music library](#pickerlocationidmusiclibrary) | | PicturesLibrary | 6 | [The Pictures library](#pickerlocationidpictureslibrary) | | VideosLibrary | 7 | [The Videos library](#pickerlocationidvideoslibrary). | @@ -29,7 +28,6 @@ enum PickerLocationId ComputerFolder = 1, Desktop = 2, Downloads = 3, - HomeGroup = 4, MusicLibrary = 5, PicturesLibrary = 6, VideosLibrary = 7, @@ -64,12 +62,6 @@ The `Downloads` value represents the user's Downloads folder. This is the default location where web browsers and other applications save downloaded files. It is often mapped to `%USERPROFILE%\Downloads`. -## PickerLocationId.HomeGroup -! Note that [HomeGroup has been removed from Windows 10 (version 1803) and later](https://support.microsoft.com/en-us/windows/homegroup-removed-from-windows-10-version-1803-07ca5db1-7bca-4d11-68a3-a31ff4a09979), -so it is not recommended to use this value. - -This enum value is retained now for backward compatibility with the [Windows.Storage.Pickers.PickerLocationId](https://learn.microsoft.com/en-us/uwp/api/windows.storage.pickers.pickerlocationid), -it might be removed in future. ## PickerLocationId.MusicLibrary The `MusicLibrary` value represents the user's Music library. From 687f58c8639bf6610fc2d12772faeda0861c5537 Mon Sep 17 00:00:00 2001 From: Dinah Gao <116714259+DinahK-2SO@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:22:04 +0800 Subject: [PATCH 02/14] validate filters and choices --- dev/Interop/StoragePickers/FileOpenPicker.cpp | 8 +++++ dev/Interop/StoragePickers/FileOpenPicker.h | 3 ++ dev/Interop/StoragePickers/PickerCommon.cpp | 31 +++++++++++++++++++ dev/Interop/StoragePickers/PickerCommon.h | 3 ++ 4 files changed, 45 insertions(+) diff --git a/dev/Interop/StoragePickers/FileOpenPicker.cpp b/dev/Interop/StoragePickers/FileOpenPicker.cpp index 5f5c2ed48c..79e39a561f 100644 --- a/dev/Interop/StoragePickers/FileOpenPicker.cpp +++ b/dev/Interop/StoragePickers/FileOpenPicker.cpp @@ -20,6 +20,7 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation : m_windowId(windowId) { THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers::IsEnabled()); + m_fileTypeFilter.VectorChanged({ this, &FileOpenPicker::OnFileTypeFilterChanged }); } winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode FileOpenPicker::ViewMode() @@ -61,6 +62,13 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation return m_fileTypeFilter; } + void FileOpenPicker::OnFileTypeFilterChanged( + winrt::Windows::Foundation::Collections::IObservableVector const&, + winrt::Windows::Foundation::Collections::IVectorChangedEventArgs const&) + { + PickerCommon::ValidateFileTypeFilter(m_fileTypeFilter.GetView()); + } + void FileOpenPicker::CaptureParameters(PickerCommon::PickerParameters& parameters) { parameters.HWnd = winrt::Microsoft::UI::GetWindowFromWindowId(m_windowId); diff --git a/dev/Interop/StoragePickers/FileOpenPicker.h b/dev/Interop/StoragePickers/FileOpenPicker.h index 208025488d..fd79ecd9cc 100644 --- a/dev/Interop/StoragePickers/FileOpenPicker.h +++ b/dev/Interop/StoragePickers/FileOpenPicker.h @@ -39,6 +39,9 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation StoragePickersTelemetryHelper m_telemetryHelper{}; void CaptureParameters(PickerCommon::PickerParameters& parameters); + void OnFileTypeFilterChanged( + winrt::Windows::Foundation::Collections::IObservableVector const&, + winrt::Windows::Foundation::Collections::IVectorChangedEventArgs const&); }; } namespace winrt::Microsoft::Windows::Storage::Pickers::factory_implementation diff --git a/dev/Interop/StoragePickers/PickerCommon.cpp b/dev/Interop/StoragePickers/PickerCommon.cpp index ca3af402e4..883671aebf 100644 --- a/dev/Interop/StoragePickers/PickerCommon.cpp +++ b/dev/Interop/StoragePickers/PickerCommon.cpp @@ -177,6 +177,37 @@ namespace PickerCommon { } } + void ValidateSingleFileTypeFilterElement(winrt::hstring filter) + { + if (filter.empty() || (filter[0] != L'.' && filter != L"*")) + { + // TODO to xiaomgao: localization + throw winrt::hresult_invalid_argument(L"IDS_APIERROR_IMPROPERFILEEXTENSION"); + } + } + + void ValidateFileTypeFilter(winrt::Windows::Foundation::Collections::IVectorView filters) + { + if (filters.Size() > 0) + { + for (const auto& filter : filters) + { + ValidateSingleFileTypeFilterElement(filter); + } + } + } + + void ValidateFileTypeChoices(winrt::Windows::Foundation::Collections::IMapView> filters) + { + if (filters.Size() > 0) + { + for (const auto& filter : filters) + { + ValidateFileTypeFilter(filter.Value().GetView()); + } + } + } + winrt::hstring PickerParameters::FormatExtensionWithWildcard(winrt::hstring extension) { if (!extension.empty() && extension[0] == L'*') diff --git a/dev/Interop/StoragePickers/PickerCommon.h b/dev/Interop/StoragePickers/PickerCommon.h index a50ee318e8..151d97c4d7 100644 --- a/dev/Interop/StoragePickers/PickerCommon.h +++ b/dev/Interop/StoragePickers/PickerCommon.h @@ -19,6 +19,9 @@ namespace PickerCommon { void ValidateViewMode(winrt::Microsoft::Windows::Storage::Pickers::PickerViewMode const& value); void ValidateSuggestedStartLocation(winrt::Microsoft::Windows::Storage::Pickers::PickerLocationId const& value); + void ValidateSingleFileTypeFilterElement(winrt::hstring filter); + void ValidateFileTypeFilter(winrt::Windows::Foundation::Collections::IVectorView filters); + void ValidateFileTypeChoices(winrt::Windows::Foundation::Collections::IMapView> filters); struct PickerParameters { HWND HWnd{}; From 60c0d78e597e1f021480db36ba1052d191c07931 Mon Sep 17 00:00:00 2001 From: Dinah Gao <116714259+DinahK-2SO@users.noreply.github.com> Date: Fri, 11 Jul 2025 14:22:06 +0800 Subject: [PATCH 03/14] localization files for local tests --- .../Strings/cs-CZ/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/de-DE/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/en-US/StoragePickers.resw | 15 +++++++++++++++ .../Strings/es-ES/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/fr-FR/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/it-IT/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/ja-JP/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/ko-KR/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/pl-PL/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/pt-BR/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/ru-RU/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/tr-TR/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/zh-CN/StoragePickers.resw | 17 ++++++++++++++++- .../Strings/zh-TW/StoragePickers.resw | 17 ++++++++++++++++- 14 files changed, 223 insertions(+), 13 deletions(-) diff --git a/dev/Interop/StoragePickers/Strings/cs-CZ/StoragePickers.resw b/dev/Interop/StoragePickers/Strings/cs-CZ/StoragePickers.resw index 9c4004aa08..09b97f0dc9 100644 --- a/dev/Interop/StoragePickers/Strings/cs-CZ/StoragePickers.resw +++ b/dev/Interop/StoragePickers/Strings/cs-CZ/StoragePickers.resw @@ -1,4 +1,4 @@ - +