| // 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 "include/flutter/flutter_engine.h" |
| |
| #include <algorithm> |
| #include <iostream> |
| |
| namespace flutter { |
| |
| FlutterEngine::FlutterEngine() {} |
| |
| FlutterEngine::~FlutterEngine() {} |
| |
| bool FlutterEngine::Start(const std::string& icu_data_path, |
| const std::string& assets_path, |
| const std::vector<std::string>& arguments, |
| const std::string& aot_library_path) { |
| if (engine_) { |
| std::cerr << "Cannot run an already running engine. Create a new instance " |
| "or call ShutDown first." |
| << std::endl; |
| return false; |
| } |
| |
| FlutterDesktopEngineProperties c_engine_properties = {}; |
| c_engine_properties.assets_path = assets_path.c_str(); |
| c_engine_properties.icu_data_path = icu_data_path.c_str(); |
| c_engine_properties.aot_library_path = aot_library_path.c_str(); |
| std::vector<const char*> engine_switches; |
| std::transform( |
| arguments.begin(), arguments.end(), std::back_inserter(engine_switches), |
| [](const std::string& arg) -> const char* { return arg.c_str(); }); |
| if (engine_switches.size() > 0) { |
| c_engine_properties.switches = &engine_switches[0]; |
| c_engine_properties.switches_count = engine_switches.size(); |
| } |
| |
| engine_ = UniqueEnginePtr(FlutterDesktopRunEngine(c_engine_properties), |
| FlutterDesktopShutDownEngine); |
| if (!engine_) { |
| std::cerr << "Failed to start engine." << std::endl; |
| return false; |
| } |
| return true; |
| } |
| |
| void FlutterEngine::ShutDown() { |
| engine_ = nullptr; |
| } |
| |
| FlutterDesktopPluginRegistrarRef FlutterEngine::GetRegistrarForPlugin( |
| const std::string& plugin_name) { |
| if (!engine_) { |
| std::cerr << "Cannot get plugin registrar on an engine that isn't running; " |
| "call Run first." |
| << std::endl; |
| return nullptr; |
| } |
| return FlutterDesktopGetPluginRegistrar(engine_.get(), plugin_name.c_str()); |
| } |
| |
| void FlutterEngine::RunEventLoopWithTimeout(std::chrono::milliseconds timeout) { |
| if (!engine_) { |
| std::cerr << "Cannot run event loop without a running engine; call " |
| "Run first." |
| << std::endl; |
| return; |
| } |
| uint32_t timeout_milliseconds; |
| if (timeout == std::chrono::milliseconds::max()) { |
| // The C API uses 0 to represent no timeout, so convert |max| to 0. |
| timeout_milliseconds = 0; |
| } else if (timeout.count() > UINT32_MAX) { |
| timeout_milliseconds = UINT32_MAX; |
| } else { |
| timeout_milliseconds = static_cast<uint32_t>(timeout.count()); |
| } |
| FlutterDesktopRunEngineEventLoopWithTimeout(engine_.get(), |
| timeout_milliseconds); |
| } |
| |
| } // namespace flutter |