diff --git a/engine/src/flutter/fml/BUILD.gn b/engine/src/flutter/fml/BUILD.gn index 221bd13c30a..285fdd6e329 100644 --- a/engine/src/flutter/fml/BUILD.gn +++ b/engine/src/flutter/fml/BUILD.gn @@ -12,6 +12,7 @@ source_set("fml") { "message_loop.h", "message_loop_impl.cc", "message_loop_impl.h", + "paths.h", "task_runner.cc", "task_runner.h", "thread.cc", @@ -43,6 +44,7 @@ source_set("fml") { "platform/darwin/message_loop_darwin.mm", "platform/darwin/nsstring_utils.h", "platform/darwin/nsstring_utils.mm", + "platform/darwin/paths_darwin.mm", "platform/darwin/resource_mapping_darwin.h", "platform/darwin/resource_mapping_darwin.mm", "platform/darwin/scoped_block.h", @@ -62,6 +64,7 @@ source_set("fml") { "platform/android/jni_weak_ref.h", "platform/android/message_loop_android.cc", "platform/android/message_loop_android.h", + "platform/android/paths_android.cc", "platform/android/scoped_java_ref.cc", "platform/android/scoped_java_ref.h", ] @@ -83,6 +86,7 @@ source_set("fml") { sources += [ "platform/linux/message_loop_linux.cc", "platform/linux/message_loop_linux.h", + "platform/linux/paths_linux.cc", "platform/linux/timerfd.cc", "platform/linux/timerfd.h", ] diff --git a/engine/src/flutter/fml/icu_util.cc b/engine/src/flutter/fml/icu_util.cc index d7737b6e88b..c2964d6a447 100644 --- a/engine/src/flutter/fml/icu_util.cc +++ b/engine/src/flutter/fml/icu_util.cc @@ -8,6 +8,7 @@ #include #include "flutter/fml/mapping.h" +#include "flutter/fml/paths.h" #include "lib/ftl/build_config.h" #include "lib/ftl/logging.h" #include "third_party/icu/source/common/unicode/udata.h" @@ -44,7 +45,16 @@ class ICUContext { // Check if the mapping can by directly accessed via a file path. In this // case, the data file needs to be next to the executable. - auto file = std::make_unique(kIcuDataFileName); + auto directory = fml::paths::GetExecutableDirectoryPath(); + + if (!directory.first) { + return false; + } + + // FIXME(chinmaygarde): There is no Path::Join in FTL. So a non-portable + // version is used here. Patch FTL and update. + auto file = std::make_unique(directory.second + "/" + + kIcuDataFileName); if (file->GetSize() != 0) { mapping_ = std::move(file); return true; diff --git a/engine/src/flutter/fml/paths.h b/engine/src/flutter/fml/paths.h new file mode 100644 index 00000000000..8ec3b4b5804 --- /dev/null +++ b/engine/src/flutter/fml/paths.h @@ -0,0 +1,19 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_FML_PATHS_H_ +#define FLUTTER_FML_PATHS_H_ + +#include +#include + +namespace fml { +namespace paths { + +std::pair GetExecutableDirectoryPath(); + +} // namespace paths +} // namespace fml + +#endif // FLUTTER_FML_PATHS_H_ diff --git a/engine/src/flutter/fml/platform/android/paths_android.cc b/engine/src/flutter/fml/platform/android/paths_android.cc new file mode 100644 index 00000000000..535bab4c001 --- /dev/null +++ b/engine/src/flutter/fml/platform/android/paths_android.cc @@ -0,0 +1,15 @@ +// Copyright 2017 The Chromium 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 "flutter/fml/paths.h" + +namespace fml { +namespace paths { + +std::pair GetExecutableDirectoryPath() { + return {false, ""}; +} + +} // namespace paths +} // namespace fml diff --git a/engine/src/flutter/fml/platform/darwin/paths_darwin.mm b/engine/src/flutter/fml/platform/darwin/paths_darwin.mm new file mode 100644 index 00000000000..de8c9102f93 --- /dev/null +++ b/engine/src/flutter/fml/platform/darwin/paths_darwin.mm @@ -0,0 +1,20 @@ +// Copyright 2017 The Chromium 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 "flutter/fml/paths.h" + +#include + +#include "lib/ftl/files/path.h" + +namespace fml { +namespace paths { + +std::pair GetExecutableDirectoryPath() { + return {true, files::GetDirectoryName( + [NSBundle mainBundle].executablePath.UTF8String)}; +} + +} // namespace paths +} // namespace fml diff --git a/engine/src/flutter/fml/platform/linux/paths_linux.cc b/engine/src/flutter/fml/platform/linux/paths_linux.cc new file mode 100644 index 00000000000..4ee3f9aa594 --- /dev/null +++ b/engine/src/flutter/fml/platform/linux/paths_linux.cc @@ -0,0 +1,25 @@ +// Copyright 2017 The Chromium 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 "flutter/fml/paths.h" + +#include + +#include "lib/ftl/files/path.h" + +namespace fml { +namespace paths { + +std::pair GetExecutableDirectoryPath() { + const int path_size = 255; + char path[path_size] = {0}; + auto read_size = ::readlink("/proc/self/exe", path, path_size); + if (read_size == -1) { + return {false, ""}; + } + return {true, files::GetDirectoryName(std::string{path, read_size})}; +} + +} // namespace paths +} // namespace fml