| // 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_view_controller.h" |
| |
| #include <algorithm> |
| #include <iostream> |
| |
| namespace flutter { |
| |
| FlutterViewController::FlutterViewController(int width, |
| int height, |
| const DartProject& project) { |
| std::vector<const char*> switches; |
| std::transform( |
| project.engine_switches().begin(), project.engine_switches().end(), |
| std::back_inserter(switches), |
| [](const std::string& arg) -> const char* { return arg.c_str(); }); |
| size_t switch_count = switches.size(); |
| |
| FlutterDesktopEngineProperties properties = {}; |
| properties.assets_path = project.assets_path().c_str(); |
| properties.icu_data_path = project.icu_data_path().c_str(); |
| // It is harmless to pass this in non-AOT mode. |
| properties.aot_library_path = project.aot_library_path().c_str(); |
| properties.switches = switch_count > 0 ? switches.data() : nullptr; |
| properties.switches_count = switch_count; |
| controller_ = FlutterDesktopCreateViewController(width, height, properties); |
| if (!controller_) { |
| std::cerr << "Failed to create view controller." << std::endl; |
| return; |
| } |
| view_ = std::make_unique<FlutterView>(FlutterDesktopGetView(controller_)); |
| } |
| |
| FlutterViewController::FlutterViewController( |
| const std::string& icu_data_path, |
| int width, |
| int height, |
| const std::string& assets_path, |
| const std::vector<std::string>& arguments) { |
| if (controller_) { |
| std::cerr << "Only one Flutter view can exist at a time." << std::endl; |
| } |
| |
| std::vector<const char*> engine_arguments; |
| std::transform( |
| arguments.begin(), arguments.end(), std::back_inserter(engine_arguments), |
| [](const std::string& arg) -> const char* { return arg.c_str(); }); |
| size_t arg_count = engine_arguments.size(); |
| |
| controller_ = FlutterDesktopCreateViewControllerLegacy( |
| width, height, assets_path.c_str(), icu_data_path.c_str(), |
| arg_count > 0 ? &engine_arguments[0] : nullptr, arg_count); |
| if (!controller_) { |
| std::cerr << "Failed to create view controller." << std::endl; |
| return; |
| } |
| view_ = std::make_unique<FlutterView>(FlutterDesktopGetView(controller_)); |
| } |
| |
| FlutterViewController::~FlutterViewController() { |
| if (controller_) { |
| FlutterDesktopDestroyViewController(controller_); |
| } |
| } |
| |
| std::chrono::nanoseconds FlutterViewController::ProcessMessages() { |
| return std::chrono::nanoseconds(FlutterDesktopProcessMessages(controller_)); |
| } |
| |
| FlutterDesktopPluginRegistrarRef FlutterViewController::GetRegistrarForPlugin( |
| const std::string& plugin_name) { |
| if (!controller_) { |
| std::cerr << "Cannot get plugin registrar without a window; call " |
| "CreateWindow first." |
| << std::endl; |
| return nullptr; |
| } |
| return FlutterDesktopGetPluginRegistrar(controller_, plugin_name.c_str()); |
| } |
| |
| } // namespace flutter |