xref: /aosp_15_r20/system/server_configurable_flags/aconfigd/libcxx_aconfigd.cpp (revision 207333786ba243bc7d4d69ef6b05487aa7071806)
1 #include "libcxx_aconfigd.hpp"
2 
3 #include <stdexcept>
4 
5 #include "com_android_aconfig_new_storage.h"
6 #include "include/aconfigd.h"
7 #include "lib.rs.h"
8 #include "rust/cxx.h"
9 
10 namespace aconfigdwrapper {
11 
12 class CppAconfigd::impl {
13   friend CppAconfigd;
14 
15  public:
impl(const std::string & root_dir,const std::string & storage_records)16   impl(const std::string& root_dir, const std::string& storage_records)
17       : m_aconfigd(std::make_unique<android::aconfigd::Aconfigd>(
18             root_dir, storage_records))
19 
20   {}
21 
22  private:
23   std::unique_ptr<android::aconfigd::Aconfigd> m_aconfigd;
24 };
25 
CppAconfigd(const std::string & str1,const std::string & str2)26 CppAconfigd::CppAconfigd(const std::string& str1, const std::string& str2)
27     : impl(new class CppAconfigd::impl(str1, str2)) {}
28 
initialize_platform_storage() const29 CppVoidResult CppAconfigd::initialize_platform_storage() const {
30   auto init_result = impl->m_aconfigd->InitializePlatformStorage();
31 
32   CppVoidResult result;
33   if (!init_result.ok()) {
34     result.error_message = init_result.error().message();
35     result.status = CppResultStatus::Err;
36   } else {
37     result.status = CppResultStatus::Ok;
38   }
39   return result;
40 }
41 
initialize_mainline_storage() const42 CppVoidResult CppAconfigd::initialize_mainline_storage() const {
43   auto init_result = impl->m_aconfigd->InitializeMainlineStorage();
44 
45   CppVoidResult result;
46   if (!init_result.ok()) {
47     result.error_message = init_result.error().message();
48     result.status = CppResultStatus::Err;
49   } else {
50     result.status = CppResultStatus::Ok;
51   }
52   return result;
53 }
54 
initialize_in_memory_storage_records() const55 CppVoidResult CppAconfigd::initialize_in_memory_storage_records() const {
56   auto init_result = impl->m_aconfigd->InitializeInMemoryStorageRecords();
57 
58   CppVoidResult result;
59   if (!init_result.ok()) {
60     result.error_message = init_result.error().message();
61     result.status = CppResultStatus::Err;
62   } else {
63     result.status = CppResultStatus::Ok;
64   }
65   return result;
66 }
67 
handle_socket_request(const std::string & messages_string) const68 CppStringResult CppAconfigd::handle_socket_request(
69     const std::string& messages_string) const {
70   auto request_messages = android::aconfigd::StorageRequestMessages{};
71   request_messages.ParseFromString(messages_string);
72 
73   auto return_messages = android::aconfigd::StorageReturnMessages();
74   for (auto& request : request_messages.msgs()) {
75     auto* return_msg = return_messages.add_msgs();
76     auto result = impl->m_aconfigd->HandleSocketRequest(request, *return_msg);
77     if (!result.ok()) {
78       auto* errmsg = return_msg->mutable_error_message();
79       *errmsg = result.error().message();
80     }
81   }
82 
83   auto content = std::string();
84   return_messages.SerializeToString(&content);
85 
86   CppStringResult result;
87   result.data = std::make_unique<std::string>(content);
88   result.status = CppResultStatus::Ok;
89   return result;
90 }
91 
new_cpp_aconfigd(const std::string & str1,const std::string & str2)92 std::unique_ptr<CppAconfigd> new_cpp_aconfigd(const std::string& str1,
93                                               const std::string& str2) {
94   return std::make_unique<CppAconfigd>(str1, str2);
95 }
96 
97 }  // namespace aconfigdwrapper
98