[go: nahoru, domu]

blob: 8e688b7266e6dc37affb359a59a9fbe5a1f4a002 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "mojo/public/cpp/system/dynamic_library_support.h"
#include <stdint.h>
#include "base/check_op.h"
#include "base/command_line.h"
#include "build/build_config.h"
#include "mojo/public/c/system/functions.h"
namespace mojo {
namespace {
// Helper for temporary storage related to |MojoInitialize()| calls.
struct InitializationState {
InitializationState(const absl::optional<base::FilePath>& path,
MojoInitializeFlags flags) {
options.flags = flags;
if (path) {
utf8_path = path->AsUTF8Unsafe();
options.mojo_core_path = utf8_path.c_str();
options.mojo_core_path_length = static_cast<uint32_t>(utf8_path.size());
}
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
// Build a temporary reconstructed argv to pass into the library so it can
// inspect the application command line if needed.
for (const std::string& s : base::CommandLine::ForCurrentProcess()->argv())
argv.push_back(s.c_str());
options.argc = static_cast<uint32_t>(argv.size());
options.argv = argv.data();
#endif
}
MojoInitializeOptions options = {sizeof(MojoInitializeOptions)};
std::string utf8_path;
std::vector<const char*> argv;
};
} // namespace
MojoResult LoadCoreLibrary(absl::optional<base::FilePath> path) {
InitializationState state(path, MOJO_INITIALIZE_FLAG_LOAD_ONLY);
return MojoInitialize(&state.options);
}
MojoResult InitializeCoreLibrary(MojoInitializeFlags flags) {
DCHECK_EQ(flags & MOJO_INITIALIZE_FLAG_LOAD_ONLY, 0u);
InitializationState state(absl::nullopt, flags);
return MojoInitialize(&state.options);
}
MojoResult LoadAndInitializeCoreLibrary(absl::optional<base::FilePath> path,
MojoInitializeFlags flags) {
DCHECK_EQ(flags & MOJO_INITIALIZE_FLAG_LOAD_ONLY, 0u);
InitializationState state(path, flags);
return MojoInitialize(&state.options);
}
} // namespace mojo