blob: c6faea0fba46dc103849f60a96d85bc0bc2a3b94 [file] [log] [blame] [edit]
// Copyright 2020 The Fuchsia 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 "src/connectivity/weave/lib/applets_loader/applets_loader.h"
#include <dlfcn.h>
#include <lib/syslog/cpp/macros.h>
#include <algorithm>
#include <optional>
namespace weavestack::applets {
namespace {
const FuchsiaWeaveAppletsModuleV1 kNullAppletModuleV1 = {
.create_applet = nullptr,
.delete_applet = nullptr,
};
} // namespace
zx_status_t AppletsLoader::CreateWithModule(const char* lib_name,
std::unique_ptr<AppletsLoader>* out) {
auto module = AppletsModuleV1::Open(lib_name);
if (!module) {
return ZX_ERR_UNAVAILABLE;
}
*out = std::unique_ptr<AppletsLoader>(new AppletsLoader(std::move(module)));
return ZX_OK;
}
std::unique_ptr<AppletsLoader> AppletsLoader::CreateWithNullModule() {
// Note we use a no-op 'release' method here since we're wrapping a static/const data member we
// want to make sure we don't free this pointer.
auto module =
std::shared_ptr<const FuchsiaWeaveAppletsModuleV1>(&kNullAppletModuleV1, [](auto* ptr) {});
return std::unique_ptr<AppletsLoader>(new AppletsLoader(AppletsModuleV1(std::move(module))));
}
Applet AppletsLoader::CreateApplet(FuchsiaWeaveAppletsCallbacksV1 callbacks) {
FX_DCHECK(module_);
auto applets_handle = module_->create_applet(callbacks);
if (applets_handle == FUCHSIA_WEAVE_APPLETS_INVALID_HANDLE) {
return {};
}
return {applets_handle, module_};
}
AppletsLoader::AppletsLoader(AppletsModuleV1 module) : module_(std::move(module)) {}
} // namespace weavestack::applets