| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/fml/command_line.h" |
| |
| #include <windows.h> |
| |
| #include <Shellapi.h> |
| #include <memory> |
| |
| namespace fml { |
| |
| std::optional<CommandLine> CommandLineFromPlatform() { |
| wchar_t* command_line = GetCommandLineW(); |
| int unicode_argc; |
| std::unique_ptr<wchar_t*[], decltype(::LocalFree)*> unicode_argv( |
| CommandLineToArgvW(command_line, &unicode_argc), ::LocalFree); |
| if (!unicode_argv) { |
| return std::nullopt; |
| } |
| std::vector<std::string> utf8_argv; |
| for (int i = 0; i < unicode_argc; ++i) { |
| wchar_t* arg = unicode_argv[i]; |
| int arg_len = WideCharToMultiByte(CP_UTF8, 0, arg, wcslen(arg), nullptr, 0, |
| nullptr, nullptr); |
| std::string utf8_arg(arg_len, 0); |
| WideCharToMultiByte(CP_UTF8, 0, arg, -1, utf8_arg.data(), utf8_arg.size(), |
| nullptr, nullptr); |
| utf8_argv.push_back(std::move(utf8_arg)); |
| } |
| return CommandLineFromIterators(utf8_argv.begin(), utf8_argv.end()); |
| } |
| |
| } // namespace fml |