mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
94 lines
2.8 KiB
C++
94 lines
2.8 KiB
C++
// 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>
|
|
|
|
#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<std::string>& entrypoint_args =
|
|
project.dart_entrypoint_arguments();
|
|
std::vector<const char*> 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<int>(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<BinaryMessengerImpl>(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
|