// 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 #include namespace flutter { FlutterEngine::FlutterEngine() {} FlutterEngine::~FlutterEngine() {} bool FlutterEngine::Start(const std::string& icu_data_path, const std::string& assets_path, const std::vector& 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 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(timeout.count()); } FlutterDesktopRunEngineEventLoopWithTimeout(engine_.get(), timeout_milliseconds); } } // namespace flutter