Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 997e6577 authored by Dennis Shen's avatar Dennis Shen Committed by Gerrit Code Review
Browse files

Merge "aconfig: create c++ interlop from rust flag apis" into main

parents 0b0f11fe 618e66a2
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
@@ -89,3 +89,52 @@ rust_protobuf {
    source_stem: "aconfig_storage_protos",
    host_supported: true,
}

cc_library_static {
    name: "libaconfig_storage_protos_cc",
    proto: {
        export_proto_headers: true,
        type: "lite",
    },
    srcs: ["protos/aconfig_storage_metadata.proto"],
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
    host_supported: true,
}

genrule {
    name: "libcxx_aconfig_storage_bridge_code",
    tools: ["cxxbridge"],
    cmd: "$(location cxxbridge) $(in) > $(out)",
    srcs: ["src/lib.rs"],
    out: ["aconfig_storage/lib.rs.cc"],
}

genrule {
    name: "libcxx_aconfig_storage_bridge_header",
    tools: ["cxxbridge"],
    cmd: "$(location cxxbridge) $(in) --header > $(out)",
    srcs: ["src/lib.rs"],
    out: ["aconfig_storage/lib.rs.h"],
}

rust_ffi_static {
    name: "libaconfig_storage_cxx_bridge",
    crate_name: "aconfig_storage_cxx_bridge",
    host_supported: true,
    defaults: ["aconfig_storage_file.defaults"],
}

cc_library_static {
    name: "libaconfig_storage_cc",
    srcs: ["aconfig_storage.cpp"],
    generated_headers: [
        "cxx-bridge-header",
        "libcxx_aconfig_storage_bridge_header"
    ],
    generated_sources: ["libcxx_aconfig_storage_bridge_code"],
    whole_static_libs: ["libaconfig_storage_cxx_bridge"],
    export_include_dirs: ["include"],
}
+1 −0
Original line number Diff line number Diff line
@@ -18,3 +18,4 @@ thiserror = "1.0.56"

[build-dependencies]
protobuf-codegen = "3.2.0"
cxx-build = "1.0"
+106 −0
Original line number Diff line number Diff line
#include "aconfig_storage/aconfig_storage.hpp"

#include "rust/cxx.h"
#include "aconfig_storage/lib.rs.h"

namespace aconfig_storage {

/// Get package offset
PackageOffsetQuery get_package_offset(
    std::string const& container,
    std::string const& package) {
  auto offset_cxx =  get_package_offset_cxx(
      rust::Str(container.c_str()),
      rust::Str(package.c_str()));
  auto offset = PackageOffsetQuery();
  offset.query_success = offset_cxx.query_success;
  offset.error_message = std::string(offset_cxx.error_message.c_str());
  offset.package_exists = offset_cxx.package_exists;
  offset.package_id = offset_cxx.package_id;
  offset.boolean_offset = offset_cxx.boolean_offset;
  return offset;
}

/// Get flag offset
FlagOffsetQuery get_flag_offset(
    std::string const& container,
    uint32_t package_id,
    std::string const& flag_name) {
  auto offset_cxx =  get_flag_offset_cxx(
      rust::Str(container.c_str()),
      package_id,
      rust::Str(flag_name.c_str()));
  auto offset = FlagOffsetQuery();
  offset.query_success = offset_cxx.query_success;
  offset.error_message = std::string(offset_cxx.error_message.c_str());
  offset.flag_exists = offset_cxx.flag_exists;
  offset.flag_offset = offset_cxx.flag_offset;
  return offset;
}

/// Get boolean flag value
BooleanFlagValueQuery get_boolean_flag_value(
    std::string const& container,
    uint32_t offset) {
  auto value_cxx =  get_boolean_flag_value_cxx(
      rust::Str(container.c_str()),
      offset);
  auto value = BooleanFlagValueQuery();
  value.query_success = value_cxx.query_success;
  value.error_message = std::string(value_cxx.error_message.c_str());
  value.flag_value = value_cxx.flag_value;
  return value;
}

namespace test_only_api {
PackageOffsetQuery get_package_offset_impl(
    std::string const& pb_file,
    std::string const& container,
    std::string const& package) {
  auto offset_cxx =  get_package_offset_cxx_impl(
      rust::Str(pb_file.c_str()),
      rust::Str(container.c_str()),
      rust::Str(package.c_str()));
  auto offset = PackageOffsetQuery();
  offset.query_success = offset_cxx.query_success;
  offset.error_message = std::string(offset_cxx.error_message.c_str());
  offset.package_exists = offset_cxx.package_exists;
  offset.package_id = offset_cxx.package_id;
  offset.boolean_offset = offset_cxx.boolean_offset;
  return offset;
}

FlagOffsetQuery get_flag_offset_impl(
    std::string const& pb_file,
    std::string const& container,
    uint32_t package_id,
    std::string const& flag_name) {
  auto offset_cxx =  get_flag_offset_cxx_impl(
      rust::Str(pb_file.c_str()),
      rust::Str(container.c_str()),
      package_id,
      rust::Str(flag_name.c_str()));
  auto offset = FlagOffsetQuery();
  offset.query_success = offset_cxx.query_success;
  offset.error_message = std::string(offset_cxx.error_message.c_str());
  offset.flag_exists = offset_cxx.flag_exists;
  offset.flag_offset = offset_cxx.flag_offset;
  return offset;
}

BooleanFlagValueQuery get_boolean_flag_value_impl(
    std::string const& pb_file,
    std::string const& container,
    uint32_t offset) {
  auto value_cxx =  get_boolean_flag_value_cxx_impl(
      rust::Str(pb_file.c_str()),
      rust::Str(container.c_str()),
      offset);
  auto value = BooleanFlagValueQuery();
  value.query_success = value_cxx.query_success;
  value.error_message = std::string(value_cxx.error_message.c_str());
  value.flag_value = value_cxx.flag_value;
  return value;
}
} // namespace test_only_api
} // namespace aconfig_storage
+3 −0
Original line number Diff line number Diff line
@@ -14,4 +14,7 @@ fn main() {
        .inputs(proto_files)
        .cargo_out_dir("aconfig_storage_protos")
        .run_from_script();

    let _ = cxx_build::bridge("src/lib.rs");
    println!("cargo:rerun-if-changed=src/lib.rs");
}
+76 −0
Original line number Diff line number Diff line
#pragma once

#include <stdint.h>
#include <string>

namespace aconfig_storage {

/// Package offset query result
struct PackageOffsetQuery {
  bool query_success;
  std::string error_message;
  bool package_exists;
  uint32_t package_id;
  uint32_t boolean_offset;
};

/// Flag offset query result
struct FlagOffsetQuery {
  bool query_success;
  std::string error_message;
  bool flag_exists;
  uint16_t flag_offset;
};

/// Boolean flag value query result
struct BooleanFlagValueQuery {
  bool query_success;
  std::string error_message;
  bool flag_value;
};

/// Get package offset
/// \input container: the flag container name
/// \input package: the flag package name
/// \returns a PackageOffsetQuery
PackageOffsetQuery get_package_offset(
    std::string const& container,
    std::string const& package);

/// Get flag offset
/// \input container: the flag container name
/// \input package_id: the flag package id obtained from package offset query
/// \input flag_name: flag name
/// \returns a FlagOffsetQuery
FlagOffsetQuery get_flag_offset(
    std::string const& container,
    uint32_t package_id,
    std::string const& flag_name);

/// Get boolean flag value
/// \input container: the flag container name
/// \input offset: the boolean flag value byte offset in the file
/// \returns a BooleanFlagValueQuery
BooleanFlagValueQuery get_boolean_flag_value(
    std::string const& container,
    uint32_t offset);

/// DO NOT USE APIS IN THE FOLLOWING NAMESPACE, TEST ONLY
namespace test_only_api {
PackageOffsetQuery get_package_offset_impl(
    std::string const& pb_file,
    std::string const& container,
    std::string const& package);

FlagOffsetQuery get_flag_offset_impl(
    std::string const& pb_file,
    std::string const& container,
    uint32_t package_id,
    std::string const& flag_name);

BooleanFlagValueQuery get_boolean_flag_value_impl(
    std::string const& pb_file,
    std::string const& container,
    uint32_t offset);
} // namespace test_only_api
} // namespace aconfig_storage
Loading