// 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 #include "binary_messenger_impl.h" namespace flutter { FlutterEngine::FlutterEngine(const DartProject& project) { FlutterDesktopEngineProperties c_engine_properties = {}; c_engine_properties.assets_path = project.assets_path().c_str(); c_engine_properties.icu_data_path = project.icu_data_path().c_str(); c_engine_properties.aot_library_path = project.aot_library_path().c_str(); const std::vector& entrypoint_args = project.dart_entrypoint_arguments(); std::vector entrypoint_argv; std::transform( entrypoint_args.begin(), entrypoint_args.end(), std::back_inserter(entrypoint_argv), [](const std::string& arg) -> const char* { return arg.c_str(); }); c_engine_properties.dart_entrypoint_argc = static_cast(entrypoint_argv.size()); c_engine_properties.dart_entrypoint_argv = entrypoint_argv.size() > 0 ? entrypoint_argv.data() : nullptr; engine_ = FlutterDesktopEngineCreate(c_engine_properties); auto core_messenger = FlutterDesktopEngineGetMessenger(engine_); messenger_ = std::make_unique(core_messenger); } FlutterEngine::~FlutterEngine() { ShutDown(); } bool FlutterEngine::Run(const char* entry_point) { if (!engine_) { std::cerr << "Cannot run an engine that failed creation." << std::endl; return false; } if (has_been_run_) { std::cerr << "Cannot run an engine more than once." << std::endl; return false; } bool run_succeeded = FlutterDesktopEngineRun(engine_, entry_point); if (!run_succeeded) { std::cerr << "Failed to start engine." << std::endl; } has_been_run_ = true; return run_succeeded; } void FlutterEngine::ShutDown() { if (engine_ && owns_engine_) { FlutterDesktopEngineDestroy(engine_); } engine_ = nullptr; } #ifndef WINUWP std::chrono::nanoseconds FlutterEngine::ProcessMessages() { return std::chrono::nanoseconds(FlutterDesktopEngineProcessMessages(engine_)); } #endif void FlutterEngine::ReloadSystemFonts() { FlutterDesktopEngineReloadSystemFonts(engine_); } 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 FlutterDesktopEngineGetPluginRegistrar(engine_, plugin_name.c_str()); } FlutterDesktopEngineRef FlutterEngine::RelinquishEngine() { owns_engine_ = false; return engine_; } } // namespace flutter