// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_ASH_SERVICES_ORCA_ORCA_LIBRARY_H_
#define CHROMEOS_ASH_SERVICES_ORCA_ORCA_LIBRARY_H_
#include <memory>
#include <string>
#include "base/logging.h"
#include "base/scoped_native_library.h"
#include "base/types/expected.h"
#include "chromeos/ash/services/orca/public/mojom/orca_service.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
struct OrcaLogger;
namespace ash::orca {
// Represents a shared library hosting the Orca service code.
class OrcaLibrary {
public:
// Function that receives logs from the shared library.
using LogSink =
base::RepeatingCallback<void(logging::LogSeverity, std::string_view)>;
enum class BindErrorCode {
kOther = 0,
kLoadFailed,
kGetFunctionPointerFailed,
kBindFailed,
};
struct BindError {
BindErrorCode code;
std::string message;
};
OrcaLibrary();
explicit OrcaLibrary(const base::FilePath& library_path);
explicit OrcaLibrary(const base::FilePath& library_path, LogSink log_sink);
~OrcaLibrary();
OrcaLibrary(const OrcaLibrary&) = delete;
OrcaLibrary& operator=(const OrcaLibrary&) = delete;
// Forwards `receiver` to the shared library to be bound.
base::expected<void, BindError> BindReceiver(
mojo::PendingReceiver<mojom::OrcaService> receiver);
private:
base::FilePath library_path_;
LogSink log_sink_;
std::unique_ptr<OrcaLogger> orca_logger_;
base::ScopedNativeLibrary library_;
};
} // namespace ash::orca
#endif // CHROMEOS_ASH_SERVICES_ORCA_ORCA_LIBRARY_H_