From bae9a5907019e485baf5b78424ace2fc009896e7 Mon Sep 17 00:00:00 2001 From: Foxushka <135865149+Foxushka@users.noreply.github.com> Date: Sat, 23 Nov 2024 18:50:41 +0000 Subject: [PATCH] fix: Fix file extension and file filter on Windows Closes #110 and partially #128 --- windows/file_saver_plugin.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/windows/file_saver_plugin.cpp b/windows/file_saver_plugin.cpp index bbc8321..18306dc 100644 --- a/windows/file_saver_plugin.cpp +++ b/windows/file_saver_plugin.cpp @@ -72,12 +72,16 @@ std::vector WideStringToVector(const wchar_t* wideStr) { } std::wstring FileExtensionToFileFilter(std::string fileExtension) { + if (fileExtension.empty()) { + return L"All Files (*.*)|*.*|"; + } + std::string fileExtensionName = fileExtension.substr(1); for (auto& c : fileExtensionName) c = (char) std::toupper(c); std::wstring wideFileExtension = std::wstring(fileExtension.begin(), fileExtension.end()); std::wstring wideFileExtensionName = std::wstring(fileExtensionName.begin(), fileExtensionName.end()); - return wideFileExtensionName + L" File\0*." + wideFileExtensionName + L"\0\0"; + return wideFileExtensionName + L" File|*." + wideFileExtensionName + L"|"; } void FileSaverPlugin::HandleMethodCall( @@ -91,22 +95,24 @@ void FileSaverPlugin::HandleMethodCall( const std::string inputFileName = std::get(inputFileNameValue); const flutter::EncodableValue& inputExtensionValue = mapArgs.at(flutter::EncodableValue("ext")); - const std::string inputExtension = std::get(inputExtensionValue); + std::string inputExtension = std::get(inputExtensionValue); + + if (!inputExtension.empty() && inputExtension[0] != '.') { + inputExtension = "." + inputExtension; + } const std::string defaultFileName = inputFileName + inputExtension; static wchar_t szFile[MAX_PATH] = L""; wcscpy_s(szFile, std::wstring(defaultFileName.begin(), defaultFileName.end()).c_str()); - const std::wstring defaultFileFilter = FileExtensionToFileFilter(inputExtension); - static wchar_t lpstrFilter[MAX_PATH] = L""; - wcscpy_s(lpstrFilter, defaultFileFilter.c_str()); + std::wstring defaultFileFilter = FileExtensionToFileFilter(inputExtension); + std::replace(defaultFileFilter.begin(), defaultFileFilter.end(), '|', '\0'); OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = NULL; - // ofn.lpstrFilter = L"All Files\0*.*\0"; - ofn.lpstrFilter = lpstrFilter; + ofn.lpstrFilter = defaultFileFilter.data(); ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;