1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "cuttlefish_config.h"
18 #include "host/libs/config/cuttlefish_config.h"
19 
20 #include <string_view>
21 
22 #include <android-base/logging.h>
23 #include <android-base/strings.h>
24 #include <json/json.h>
25 
26 #include "common/libs/utils/files.h"
27 #include "common/libs/utils/flags_validator.h"
28 #include "host/libs/vm_manager/crosvm_manager.h"
29 #include "host/libs/vm_manager/gem5_manager.h"
30 
31 namespace cuttlefish {
32 namespace {
33 
34 using APBootFlow = CuttlefishConfig::InstanceSpecific::APBootFlow;
35 
36 const char* kInstances = "instances";
37 
IdToName(const std::string & id)38 std::string IdToName(const std::string& id) { return kCvdNamePrefix + id; }
39 
40 }  // namespace
41 
operator <<(std::ostream & out,ExternalNetworkMode net)42 std::ostream& operator<<(std::ostream& out, ExternalNetworkMode net) {
43   switch (net) {
44     case ExternalNetworkMode::kUnknown:
45       return out << "unknown";
46     case ExternalNetworkMode::kTap:
47       return out << "tap";
48     case ExternalNetworkMode::kSlirp:
49       return out << "slirp";
50   }
51 }
ParseExternalNetworkMode(std::string_view str)52 Result<ExternalNetworkMode> ParseExternalNetworkMode(std::string_view str) {
53   if (android::base::EqualsIgnoreCase(str, "tap")) {
54     return ExternalNetworkMode::kTap;
55   } else if (android::base::EqualsIgnoreCase(str, "slirp")) {
56     return ExternalNetworkMode::kSlirp;
57   } else {
58     return CF_ERRF(
59         "\"{}\" is not a valid ExternalNetworkMode. Valid values are \"tap\" "
60         "and \"slirp\"",
61         str);
62   }
63 }
64 
ToString(VmmMode mode)65 std::string ToString(VmmMode mode) {
66   std::stringstream ss;
67   ss << mode;
68   return ss.str();
69 }
70 
operator <<(std::ostream & out,VmmMode vmm)71 std::ostream& operator<<(std::ostream& out, VmmMode vmm) {
72   switch (vmm) {
73     case VmmMode::kUnknown:
74       return out << "unknown";
75     case VmmMode::kCrosvm:
76       return out << "crosvm";
77     case VmmMode::kGem5:
78       return out << "gem5";
79     case VmmMode::kQemu:
80       return out << "qemu_cli";
81   }
82 }
83 
ParseVmm(std::string_view str)84 Result<VmmMode> ParseVmm(std::string_view str) {
85   if (android::base::EqualsIgnoreCase(str, "crosvm")) {
86     return VmmMode::kCrosvm;
87   } else if (android::base::EqualsIgnoreCase(str, "gem5")) {
88     return VmmMode::kGem5;
89   } else if (android::base::EqualsIgnoreCase(str, "qemu_cli")) {
90     return VmmMode::kQemu;
91   } else {
92     return CF_ERRF("\"{}\" is not a valid Vmm.", str);
93   }
94 }
95 
96 static constexpr char kInstanceDir[] = "instance_dir";
MutableInstanceSpecific(CuttlefishConfig * config,const std::string & id)97 CuttlefishConfig::MutableInstanceSpecific::MutableInstanceSpecific(
98     CuttlefishConfig* config, const std::string& id)
99     : config_(config), id_(id) {
100   // Legacy for acloud
101   (*Dictionary())[kInstanceDir] = config_->InstancesPath(IdToName(id));
102 }
103 
Dictionary()104 Json::Value* CuttlefishConfig::MutableInstanceSpecific::Dictionary() {
105   return &(*config_->dictionary_)[kInstances][id_];
106 }
107 
Dictionary() const108 const Json::Value* CuttlefishConfig::InstanceSpecific::Dictionary() const {
109   return &(*config_->dictionary_)[kInstances][id_];
110 }
111 
instance_dir() const112 std::string CuttlefishConfig::InstanceSpecific::instance_dir() const {
113   return config_->InstancesPath(IdToName(id_));
114 }
115 
instance_internal_dir() const116 std::string CuttlefishConfig::InstanceSpecific::instance_internal_dir() const {
117   return PerInstancePath(kInternalDirName);
118 }
119 
instance_uds_dir() const120 std::string CuttlefishConfig::InstanceSpecific::instance_uds_dir() const {
121   return config_->InstancesUdsPath(IdToName(id_));
122 }
123 
instance_internal_uds_dir() const124 std::string CuttlefishConfig::InstanceSpecific::instance_internal_uds_dir()
125     const {
126   return PerInstanceUdsPath(kInternalDirName);
127 }
128 
129 // TODO (b/163575714) add virtio console support to the bootloader so the
130 // virtio console path for the console device can be taken again. When that
131 // happens, this function can be deleted along with all the code paths it
132 // forces.
use_bootloader() const133 bool CuttlefishConfig::InstanceSpecific::use_bootloader() const {
134   return true;
135 };
136 
137 // vectorized and moved system image files into instance specific
138 static constexpr char kBootImage[] = "boot_image";
boot_image() const139 std::string CuttlefishConfig::InstanceSpecific::boot_image() const {
140   return (*Dictionary())[kBootImage].asString();
141 }
set_boot_image(const std::string & boot_image)142 void CuttlefishConfig::MutableInstanceSpecific::set_boot_image(
143     const std::string& boot_image) {
144   (*Dictionary())[kBootImage] = boot_image;
145 }
146 static constexpr char kNewBootImage[] = "new_boot_image";
new_boot_image() const147 std::string CuttlefishConfig::InstanceSpecific::new_boot_image() const {
148   return (*Dictionary())[kNewBootImage].asString();
149 }
set_new_boot_image(const std::string & new_boot_image)150 void CuttlefishConfig::MutableInstanceSpecific::set_new_boot_image(
151     const std::string& new_boot_image) {
152   (*Dictionary())[kNewBootImage] = new_boot_image;
153 }
154 static constexpr char kInitBootImage[] = "init_boot_image";
init_boot_image() const155 std::string CuttlefishConfig::InstanceSpecific::init_boot_image() const {
156   return (*Dictionary())[kInitBootImage].asString();
157 }
set_init_boot_image(const std::string & init_boot_image)158 void CuttlefishConfig::MutableInstanceSpecific::set_init_boot_image(
159     const std::string& init_boot_image) {
160   (*Dictionary())[kInitBootImage] = init_boot_image;
161 }
162 static constexpr char kDataImage[] = "data_image";
data_image() const163 std::string CuttlefishConfig::InstanceSpecific::data_image() const {
164   return (*Dictionary())[kDataImage].asString();
165 }
set_data_image(const std::string & data_image)166 void CuttlefishConfig::MutableInstanceSpecific::set_data_image(
167     const std::string& data_image) {
168   (*Dictionary())[kDataImage] = data_image;
169 }
170 static constexpr char kNewDataImage[] = "new_data_image";
new_data_image() const171 std::string CuttlefishConfig::InstanceSpecific::new_data_image() const {
172   return (*Dictionary())[kNewDataImage].asString();
173 }
set_new_data_image(const std::string & new_data_image)174 void CuttlefishConfig::MutableInstanceSpecific::set_new_data_image(
175     const std::string& new_data_image) {
176   (*Dictionary())[kNewDataImage] = new_data_image;
177 }
178 static constexpr char kSuperImage[] = "super_image";
super_image() const179 std::string CuttlefishConfig::InstanceSpecific::super_image() const {
180   return (*Dictionary())[kSuperImage].asString();
181 }
set_super_image(const std::string & super_image)182 void CuttlefishConfig::MutableInstanceSpecific::set_super_image(
183     const std::string& super_image) {
184   (*Dictionary())[kSuperImage] = super_image;
185 }
186 static constexpr char kNewSuperImage[] = "new_super_image";
new_super_image() const187 std::string CuttlefishConfig::InstanceSpecific::new_super_image() const {
188   return (*Dictionary())[kNewSuperImage].asString();
189 }
set_new_super_image(const std::string & super_image)190 void CuttlefishConfig::MutableInstanceSpecific::set_new_super_image(
191     const std::string& super_image) {
192   (*Dictionary())[kNewSuperImage] = super_image;
193 }
194 static constexpr char kMiscInfoTxt[] = "misc_info_txt";
misc_info_txt() const195 std::string CuttlefishConfig::InstanceSpecific::misc_info_txt() const {
196   return (*Dictionary())[kMiscInfoTxt].asString();
197 }
set_misc_info_txt(const std::string & misc_info)198 void CuttlefishConfig::MutableInstanceSpecific::set_misc_info_txt(
199     const std::string& misc_info) {
200   (*Dictionary())[kMiscInfoTxt] = misc_info;
201 }
202 static constexpr char kVendorBootImage[] = "vendor_boot_image";
vendor_boot_image() const203 std::string CuttlefishConfig::InstanceSpecific::vendor_boot_image() const {
204   return (*Dictionary())[kVendorBootImage].asString();
205 }
set_vendor_boot_image(const std::string & vendor_boot_image)206 void CuttlefishConfig::MutableInstanceSpecific::set_vendor_boot_image(
207     const std::string& vendor_boot_image) {
208   (*Dictionary())[kVendorBootImage] = vendor_boot_image;
209 }
210 static constexpr char kNewVendorBootImage[] = "new_vendor_boot_image";
new_vendor_boot_image() const211 std::string CuttlefishConfig::InstanceSpecific::new_vendor_boot_image() const {
212   return (*Dictionary())[kNewVendorBootImage].asString();
213 }
set_new_vendor_boot_image(const std::string & new_vendor_boot_image)214 void CuttlefishConfig::MutableInstanceSpecific::set_new_vendor_boot_image(
215     const std::string& new_vendor_boot_image) {
216   (*Dictionary())[kNewVendorBootImage] = new_vendor_boot_image;
217 }
218 static constexpr char kVbmetaImage[] = "vbmeta_image";
vbmeta_image() const219 std::string CuttlefishConfig::InstanceSpecific::vbmeta_image() const {
220   return (*Dictionary())[kVbmetaImage].asString();
221 }
set_vbmeta_image(const std::string & vbmeta_image)222 void CuttlefishConfig::MutableInstanceSpecific::set_vbmeta_image(
223     const std::string& vbmeta_image) {
224   (*Dictionary())[kVbmetaImage] = vbmeta_image;
225 }
226 static constexpr char kNewVbmetaImage[] = "new_vbmeta_image";
new_vbmeta_image() const227 std::string CuttlefishConfig::InstanceSpecific::new_vbmeta_image() const {
228   return (*Dictionary())[kNewVbmetaImage].asString();
229 }
set_new_vbmeta_image(const std::string & new_vbmeta_image)230 void CuttlefishConfig::MutableInstanceSpecific::set_new_vbmeta_image(
231     const std::string& new_vbmeta_image) {
232   (*Dictionary())[kNewVbmetaImage] = new_vbmeta_image;
233 }
234 static constexpr char kVbmetaSystemImage[] = "vbmeta_system_image";
vbmeta_system_image() const235 std::string CuttlefishConfig::InstanceSpecific::vbmeta_system_image() const {
236   return (*Dictionary())[kVbmetaSystemImage].asString();
237 }
set_vbmeta_system_image(const std::string & vbmeta_system_image)238 void CuttlefishConfig::MutableInstanceSpecific::set_vbmeta_system_image(
239     const std::string& vbmeta_system_image) {
240   (*Dictionary())[kVbmetaSystemImage] = vbmeta_system_image;
241 }
242 static constexpr char kVbmetaVendorDlkmImage[] = "vbmeta_vendor_dlkm_image";
vbmeta_vendor_dlkm_image() const243 std::string CuttlefishConfig::InstanceSpecific::vbmeta_vendor_dlkm_image()
244     const {
245   return (*Dictionary())[kVbmetaVendorDlkmImage].asString();
246 }
set_vbmeta_vendor_dlkm_image(const std::string & image)247 void CuttlefishConfig::MutableInstanceSpecific::set_vbmeta_vendor_dlkm_image(
248     const std::string& image) {
249   (*Dictionary())[kVbmetaVendorDlkmImage] = image;
250 }
251 static constexpr char kNewVbmetaVendorDlkmImage[] =
252     "new_vbmeta_vendor_dlkm_image";
new_vbmeta_vendor_dlkm_image() const253 std::string CuttlefishConfig::InstanceSpecific::new_vbmeta_vendor_dlkm_image()
254     const {
255   return (*Dictionary())[kNewVbmetaVendorDlkmImage].asString();
256 }
257 void CuttlefishConfig::MutableInstanceSpecific::
set_new_vbmeta_vendor_dlkm_image(const std::string & image)258     set_new_vbmeta_vendor_dlkm_image(const std::string& image) {
259   (*Dictionary())[kNewVbmetaVendorDlkmImage] = image;
260 }
261 static constexpr char kVbmetaSystemDlkmImage[] = "vbmeta_system_dlkm_image";
vbmeta_system_dlkm_image() const262 std::string CuttlefishConfig::InstanceSpecific::vbmeta_system_dlkm_image()
263     const {
264   return (*Dictionary())[kVbmetaSystemDlkmImage].asString();
265 }
set_vbmeta_system_dlkm_image(const std::string & image)266 void CuttlefishConfig::MutableInstanceSpecific::set_vbmeta_system_dlkm_image(
267     const std::string& image) {
268   (*Dictionary())[kVbmetaSystemDlkmImage] = image;
269 }
270 static constexpr char kNewVbmetaSystemDlkmImage[] =
271     "new_vbmeta_system_dlkm_image";
new_vbmeta_system_dlkm_image() const272 std::string CuttlefishConfig::InstanceSpecific::new_vbmeta_system_dlkm_image()
273     const {
274   return (*Dictionary())[kNewVbmetaSystemDlkmImage].asString();
275 }
276 void CuttlefishConfig::MutableInstanceSpecific::
set_new_vbmeta_system_dlkm_image(const std::string & image)277     set_new_vbmeta_system_dlkm_image(const std::string& image) {
278   (*Dictionary())[kNewVbmetaSystemDlkmImage] = image;
279 }
280 static constexpr char kOtherosEspImage[] = "otheros_esp_image";
otheros_esp_image() const281 std::string CuttlefishConfig::InstanceSpecific::otheros_esp_image() const {
282   return (*Dictionary())[kOtherosEspImage].asString();
283 }
set_otheros_esp_image(const std::string & otheros_esp_image)284 void CuttlefishConfig::MutableInstanceSpecific::set_otheros_esp_image(
285     const std::string& otheros_esp_image) {
286   (*Dictionary())[kOtherosEspImage] = otheros_esp_image;
287 }
288 static constexpr char kAndroidEfiLoader[] = "android_efi_loader";
android_efi_loader() const289 std::string CuttlefishConfig::InstanceSpecific::android_efi_loader() const {
290   return (*Dictionary())[kAndroidEfiLoader].asString();
291 }
set_android_efi_loader(const std::string & android_efi_loader)292 void CuttlefishConfig::MutableInstanceSpecific::set_android_efi_loader(
293     const std::string& android_efi_loader) {
294   (*Dictionary())[kAndroidEfiLoader] = android_efi_loader;
295 }
296 static constexpr char kChromeOsDisk[] = "chromeos_disk";
chromeos_disk() const297 std::string CuttlefishConfig::InstanceSpecific::chromeos_disk() const {
298   return (*Dictionary())[kChromeOsDisk].asString();
299 }
set_chromeos_disk(const std::string & chromeos_disk)300 void CuttlefishConfig::MutableInstanceSpecific::set_chromeos_disk(
301     const std::string& chromeos_disk) {
302   (*Dictionary())[kChromeOsDisk] = chromeos_disk;
303 }
304 static constexpr char kChromeOsKernelPath[] = "chromeos_kernel_path";
chromeos_kernel_path() const305 std::string CuttlefishConfig::InstanceSpecific::chromeos_kernel_path() const {
306   return (*Dictionary())[kChromeOsKernelPath].asString();
307 }
set_chromeos_kernel_path(const std::string & chromeos_kernel_path)308 void CuttlefishConfig::MutableInstanceSpecific::set_chromeos_kernel_path(
309     const std::string& chromeos_kernel_path) {
310   (*Dictionary())[kChromeOsKernelPath] = chromeos_kernel_path;
311 }
312 static constexpr char kChromeOsRootImage[] = "chromeos_root_image";
chromeos_root_image() const313 std::string CuttlefishConfig::InstanceSpecific::chromeos_root_image() const {
314   return (*Dictionary())[kChromeOsRootImage].asString();
315 }
set_chromeos_root_image(const std::string & chromeos_root_image)316 void CuttlefishConfig::MutableInstanceSpecific::set_chromeos_root_image(
317     const std::string& chromeos_root_image) {
318   (*Dictionary())[kChromeOsRootImage] = chromeos_root_image;
319 }
320 static constexpr char kLinuxKernelPath[] = "linux_kernel_path";
linux_kernel_path() const321 std::string CuttlefishConfig::InstanceSpecific::linux_kernel_path() const {
322   return (*Dictionary())[kLinuxKernelPath].asString();
323 }
set_linux_kernel_path(const std::string & linux_kernel_path)324 void CuttlefishConfig::MutableInstanceSpecific::set_linux_kernel_path(
325     const std::string& linux_kernel_path) {
326   (*Dictionary())[kLinuxKernelPath] = linux_kernel_path;
327 }
328 static constexpr char kLinuxInitramfsPath[] = "linux_initramfs_path";
linux_initramfs_path() const329 std::string CuttlefishConfig::InstanceSpecific::linux_initramfs_path() const {
330   return (*Dictionary())[kLinuxInitramfsPath].asString();
331 }
set_linux_initramfs_path(const std::string & linux_initramfs_path)332 void CuttlefishConfig::MutableInstanceSpecific::set_linux_initramfs_path(
333     const std::string& linux_initramfs_path) {
334   (*Dictionary())[kLinuxInitramfsPath] = linux_initramfs_path;
335 }
336 static constexpr char kLinuxRootImage[] = "linux_root_image";
linux_root_image() const337 std::string CuttlefishConfig::InstanceSpecific::linux_root_image() const {
338   return (*Dictionary())[kLinuxRootImage].asString();
339 }
set_linux_root_image(const std::string & linux_root_image)340 void CuttlefishConfig::MutableInstanceSpecific::set_linux_root_image(
341     const std::string& linux_root_image) {
342   (*Dictionary())[kLinuxRootImage] = linux_root_image;
343 }
344 static constexpr char kFuchsiaZedbootPath[] = "fuchsia_zedboot_path";
set_fuchsia_zedboot_path(const std::string & fuchsia_zedboot_path)345 void CuttlefishConfig::MutableInstanceSpecific::set_fuchsia_zedboot_path(
346     const std::string& fuchsia_zedboot_path) {
347   (*Dictionary())[kFuchsiaZedbootPath] = fuchsia_zedboot_path;
348 }
fuchsia_zedboot_path() const349 std::string CuttlefishConfig::InstanceSpecific::fuchsia_zedboot_path() const {
350   return (*Dictionary())[kFuchsiaZedbootPath].asString();
351 }
352 static constexpr char kFuchsiaMultibootBinPath[] = "multiboot_bin_path";
set_fuchsia_multiboot_bin_path(const std::string & fuchsia_multiboot_bin_path)353 void CuttlefishConfig::MutableInstanceSpecific::set_fuchsia_multiboot_bin_path(
354     const std::string& fuchsia_multiboot_bin_path) {
355   (*Dictionary())[kFuchsiaMultibootBinPath] = fuchsia_multiboot_bin_path;
356 }
fuchsia_multiboot_bin_path() const357 std::string CuttlefishConfig::InstanceSpecific::fuchsia_multiboot_bin_path() const {
358   return (*Dictionary())[kFuchsiaMultibootBinPath].asString();
359 }
360 static constexpr char kFuchsiaRootImage[] = "fuchsia_root_image";
set_fuchsia_root_image(const std::string & fuchsia_root_image)361 void CuttlefishConfig::MutableInstanceSpecific::set_fuchsia_root_image(
362     const std::string& fuchsia_root_image) {
363   (*Dictionary())[kFuchsiaRootImage] = fuchsia_root_image;
364 }
fuchsia_root_image() const365 std::string CuttlefishConfig::InstanceSpecific::fuchsia_root_image() const {
366   return (*Dictionary())[kFuchsiaRootImage].asString();
367 }
368 static constexpr char kCustomPartitionPath[] = "custom_partition_path";
set_custom_partition_path(const std::string & custom_partition_path)369 void CuttlefishConfig::MutableInstanceSpecific::set_custom_partition_path(
370     const std::string& custom_partition_path) {
371   (*Dictionary())[kCustomPartitionPath] = custom_partition_path;
372 }
custom_partition_path() const373 std::string CuttlefishConfig::InstanceSpecific::custom_partition_path() const {
374   return (*Dictionary())[kCustomPartitionPath].asString();
375 }
376 static constexpr char kHibernationPartitionImage[] =
377     "hibernation_partition_image";
set_hibernation_partition_image(const std::string & hibernation_partition_image)378 void CuttlefishConfig::MutableInstanceSpecific::set_hibernation_partition_image(
379     const std::string& hibernation_partition_image) {
380   (*Dictionary())[kHibernationPartitionImage] = hibernation_partition_image;
381 }
hibernation_partition_image() const382 std::string CuttlefishConfig::InstanceSpecific::hibernation_partition_image()
383     const {
384   return (*Dictionary())[kHibernationPartitionImage].asString();
385 }
386 static constexpr char kBlankMetadataImageMb[] = "blank_metadata_image_mb";
blank_metadata_image_mb() const387 int CuttlefishConfig::InstanceSpecific::blank_metadata_image_mb() const {
388   return (*Dictionary())[kBlankMetadataImageMb].asInt();
389 }
set_blank_metadata_image_mb(int blank_metadata_image_mb)390 void CuttlefishConfig::MutableInstanceSpecific::set_blank_metadata_image_mb(
391     int blank_metadata_image_mb) {
392   (*Dictionary())[kBlankMetadataImageMb] = blank_metadata_image_mb;
393 }
394 static constexpr char kBlankSdcardImageMb[] = "blank_sdcard_image_mb";
blank_sdcard_image_mb() const395 int CuttlefishConfig::InstanceSpecific::blank_sdcard_image_mb() const {
396   return (*Dictionary())[kBlankSdcardImageMb].asInt();
397 }
set_blank_sdcard_image_mb(int blank_sdcard_image_mb)398 void CuttlefishConfig::MutableInstanceSpecific::set_blank_sdcard_image_mb(
399     int blank_sdcard_image_mb) {
400   (*Dictionary())[kBlankSdcardImageMb] = blank_sdcard_image_mb;
401 }
402 static constexpr char kBootloader[] = "bootloader";
bootloader() const403 std::string CuttlefishConfig::InstanceSpecific::bootloader() const {
404   return (*Dictionary())[kBootloader].asString();
405 }
set_bootloader(const std::string & bootloader)406 void CuttlefishConfig::MutableInstanceSpecific::set_bootloader(
407     const std::string& bootloader) {
408   (*Dictionary())[kBootloader] = bootloader;
409 }
410 static constexpr char kInitramfsPath[] = "initramfs_path";
initramfs_path() const411 std::string CuttlefishConfig::InstanceSpecific::initramfs_path() const {
412   return (*Dictionary())[kInitramfsPath].asString();
413 }
set_initramfs_path(const std::string & initramfs_path)414 void CuttlefishConfig::MutableInstanceSpecific::set_initramfs_path(
415     const std::string& initramfs_path) {
416   (*Dictionary())[kInitramfsPath] = initramfs_path;
417 }
418 static constexpr char kKernelPath[] = "kernel_path";
kernel_path() const419 std::string CuttlefishConfig::InstanceSpecific::kernel_path() const {
420   return (*Dictionary())[kKernelPath].asString();
421 }
set_kernel_path(const std::string & kernel_path)422 void CuttlefishConfig::MutableInstanceSpecific::set_kernel_path(
423     const std::string& kernel_path) {
424   (*Dictionary())[kKernelPath] = kernel_path;
425 }
426 static constexpr char kVvmtruststorePath[] = "vvmtruststore_path";
set_vvmtruststore_path(const std::string & vvmtruststore_path)427 void CuttlefishConfig::MutableInstanceSpecific::set_vvmtruststore_path(
428     const std::string& vvmtruststore_path) {
429   (*Dictionary())[kVvmtruststorePath] = vvmtruststore_path;
430 }
vvmtruststore_path() const431 std::string CuttlefishConfig::InstanceSpecific::vvmtruststore_path() const {
432   return (*Dictionary())[kVvmtruststorePath].asString();
433 }
434 // end of system image files
435 
436 static constexpr char kDefaultTargetZip[] = "default_target_zip";
default_target_zip() const437 std::string CuttlefishConfig::InstanceSpecific::default_target_zip() const {
438   return (*Dictionary())[kDefaultTargetZip].asString();
439 }
set_default_target_zip(const std::string & default_target_zip)440 void CuttlefishConfig::MutableInstanceSpecific::set_default_target_zip(
441     const std::string& default_target_zip) {
442   (*Dictionary())[kDefaultTargetZip] = default_target_zip;
443 }
444 static constexpr char kSystemTargetZip[] = "system_target_zip";
system_target_zip() const445 std::string CuttlefishConfig::InstanceSpecific::system_target_zip() const {
446   return (*Dictionary())[kSystemTargetZip].asString();
447 }
set_system_target_zip(const std::string & system_target_zip)448 void CuttlefishConfig::MutableInstanceSpecific::set_system_target_zip(
449     const std::string& system_target_zip) {
450   (*Dictionary())[kSystemTargetZip] = system_target_zip;
451 }
452 
453 static constexpr char kSerialNumber[] = "serial_number";
serial_number() const454 std::string CuttlefishConfig::InstanceSpecific::serial_number() const {
455   return (*Dictionary())[kSerialNumber].asString();
456 }
set_serial_number(const std::string & serial_number)457 void CuttlefishConfig::MutableInstanceSpecific::set_serial_number(
458     const std::string& serial_number) {
459   (*Dictionary())[kSerialNumber] = serial_number;
460 }
461 
462 static constexpr char kVirtualDiskPaths[] = "virtual_disk_paths";
virtual_disk_paths() const463 std::vector<std::string> CuttlefishConfig::InstanceSpecific::virtual_disk_paths() const {
464   std::vector<std::string> virtual_disks;
465   auto virtual_disks_json_obj = (*Dictionary())[kVirtualDiskPaths];
466   for (const auto& disk : virtual_disks_json_obj) {
467     virtual_disks.push_back(disk.asString());
468   }
469   return virtual_disks;
470 }
set_virtual_disk_paths(const std::vector<std::string> & virtual_disk_paths)471 void CuttlefishConfig::MutableInstanceSpecific::set_virtual_disk_paths(
472     const std::vector<std::string>& virtual_disk_paths) {
473   Json::Value virtual_disks_json_obj(Json::arrayValue);
474   for (const auto& arg : virtual_disk_paths) {
475     virtual_disks_json_obj.append(arg);
476   }
477   (*Dictionary())[kVirtualDiskPaths] = virtual_disks_json_obj;
478 }
479 
480 static constexpr char kGuestAndroidVersion[] = "guest_android_version";
guest_android_version() const481 std::string CuttlefishConfig::InstanceSpecific::guest_android_version() const {
482   return (*Dictionary())[kGuestAndroidVersion].asString();
483 }
set_guest_android_version(const std::string & guest_android_version)484 void CuttlefishConfig::MutableInstanceSpecific::set_guest_android_version(
485     const std::string& guest_android_version) {
486   (*Dictionary())[kGuestAndroidVersion] = guest_android_version;
487 }
488 
489 static constexpr char kBootconfigSupported[] = "bootconfig_supported";
bootconfig_supported() const490 bool CuttlefishConfig::InstanceSpecific::bootconfig_supported() const {
491   return (*Dictionary())[kBootconfigSupported].asBool();
492 }
set_bootconfig_supported(bool bootconfig_supported)493 void CuttlefishConfig::MutableInstanceSpecific::set_bootconfig_supported(
494     bool bootconfig_supported) {
495   (*Dictionary())[kBootconfigSupported] = bootconfig_supported;
496 }
497 
498 static constexpr char kFilenameEncryptionMode[] = "filename_encryption_mode";
filename_encryption_mode() const499 std::string CuttlefishConfig::InstanceSpecific::filename_encryption_mode() const {
500   return (*Dictionary())[kFilenameEncryptionMode].asString();
501 }
set_filename_encryption_mode(const std::string & filename_encryption_mode)502 void CuttlefishConfig::MutableInstanceSpecific::set_filename_encryption_mode(
503     const std::string& filename_encryption_mode) {
504   auto fmt = filename_encryption_mode;
505   std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::tolower);
506   (*Dictionary())[kFilenameEncryptionMode] = fmt;
507 }
508 
509 static constexpr char kExternalNetworkMode[] = "external_network_mode";
external_network_mode() const510 ExternalNetworkMode CuttlefishConfig::InstanceSpecific::external_network_mode()
511     const {
512   auto str = (*Dictionary())[kExternalNetworkMode].asString();
513   return ParseExternalNetworkMode(str).value_or(ExternalNetworkMode::kUnknown);
514 }
set_external_network_mode(ExternalNetworkMode mode)515 void CuttlefishConfig::MutableInstanceSpecific::set_external_network_mode(
516     ExternalNetworkMode mode) {
517   (*Dictionary())[kExternalNetworkMode] = fmt::format("{}", mode);
518 }
519 
kernel_log_pipe_name() const520 std::string CuttlefishConfig::InstanceSpecific::kernel_log_pipe_name() const {
521   return AbsolutePath(PerInstanceInternalPath("kernel-log-pipe"));
522 }
523 
console_pipe_prefix() const524 std::string CuttlefishConfig::InstanceSpecific::console_pipe_prefix() const {
525   return AbsolutePath(PerInstanceInternalPath("console"));
526 }
527 
console_in_pipe_name() const528 std::string CuttlefishConfig::InstanceSpecific::console_in_pipe_name() const {
529   return console_pipe_prefix() + ".in";
530 }
531 
console_out_pipe_name() const532 std::string CuttlefishConfig::InstanceSpecific::console_out_pipe_name() const {
533   return console_pipe_prefix() + ".out";
534 }
535 
gnss_pipe_prefix() const536 std::string CuttlefishConfig::InstanceSpecific::gnss_pipe_prefix() const {
537   return AbsolutePath(PerInstanceInternalPath("gnss"));
538 }
539 
gnss_in_pipe_name() const540 std::string CuttlefishConfig::InstanceSpecific::gnss_in_pipe_name() const {
541   return gnss_pipe_prefix() + ".in";
542 }
543 
gnss_out_pipe_name() const544 std::string CuttlefishConfig::InstanceSpecific::gnss_out_pipe_name() const {
545   return gnss_pipe_prefix() + ".out";
546 }
547 
548 static constexpr char kGnssGrpcProxyServerPort[] =
549     "gnss_grpc_proxy_server_port";
gnss_grpc_proxy_server_port() const550 int CuttlefishConfig::InstanceSpecific::gnss_grpc_proxy_server_port() const {
551   return (*Dictionary())[kGnssGrpcProxyServerPort].asInt();
552 }
set_gnss_grpc_proxy_server_port(int gnss_grpc_proxy_server_port)553 void CuttlefishConfig::MutableInstanceSpecific::set_gnss_grpc_proxy_server_port(
554     int gnss_grpc_proxy_server_port) {
555   (*Dictionary())[kGnssGrpcProxyServerPort] = gnss_grpc_proxy_server_port;
556 }
557 
558 static constexpr char kGnssFilePath[] = "gnss_file_path";
gnss_file_path() const559 std::string CuttlefishConfig::InstanceSpecific::gnss_file_path() const {
560   return (*Dictionary())[kGnssFilePath].asString();
561 }
set_gnss_file_path(const std::string & gnss_file_path)562 void CuttlefishConfig::MutableInstanceSpecific::set_gnss_file_path(
563   const std::string& gnss_file_path) {
564   (*Dictionary())[kGnssFilePath] = gnss_file_path;
565 }
566 
567 static constexpr char kFixedLocationFilePath[] = "fixed_location_file_path";
fixed_location_file_path() const568 std::string CuttlefishConfig::InstanceSpecific::fixed_location_file_path()
569     const {
570   return (*Dictionary())[kFixedLocationFilePath].asString();
571 }
set_fixed_location_file_path(const std::string & fixed_location_file_path)572 void CuttlefishConfig::MutableInstanceSpecific::set_fixed_location_file_path(
573     const std::string& fixed_location_file_path) {
574   (*Dictionary())[kFixedLocationFilePath] = fixed_location_file_path;
575 }
576 
577 static constexpr char kGem5BinaryDir[] = "gem5_binary_dir";
gem5_binary_dir() const578 std::string CuttlefishConfig::InstanceSpecific::gem5_binary_dir() const {
579   return (*Dictionary())[kGem5BinaryDir].asString();
580 }
set_gem5_binary_dir(const std::string & gem5_binary_dir)581 void CuttlefishConfig::MutableInstanceSpecific::set_gem5_binary_dir(
582     const std::string& gem5_binary_dir) {
583   (*Dictionary())[kGem5BinaryDir] = gem5_binary_dir;
584 }
585 
586 static constexpr char kGem5CheckpointDir[] = "gem5_checkpoint_dir";
gem5_checkpoint_dir() const587 std::string CuttlefishConfig::InstanceSpecific::gem5_checkpoint_dir() const {
588   return (*Dictionary())[kGem5CheckpointDir].asString();
589 }
set_gem5_checkpoint_dir(const std::string & gem5_checkpoint_dir)590 void CuttlefishConfig::MutableInstanceSpecific::set_gem5_checkpoint_dir(
591     const std::string& gem5_checkpoint_dir) {
592   (*Dictionary())[kGem5CheckpointDir] = gem5_checkpoint_dir;
593 }
594 
595 static constexpr char kKgdb[] = "kgdb";
set_kgdb(bool kgdb)596 void CuttlefishConfig::MutableInstanceSpecific::set_kgdb(bool kgdb) {
597   (*Dictionary())[kKgdb] = kgdb;
598 }
kgdb() const599 bool CuttlefishConfig::InstanceSpecific::kgdb() const {
600   return (*Dictionary())[kKgdb].asBool();
601 }
602 
603 static constexpr char kCpus[] = "cpus";
set_cpus(int cpus)604 void CuttlefishConfig::MutableInstanceSpecific::set_cpus(int cpus) { (*Dictionary())[kCpus] = cpus; }
cpus() const605 int CuttlefishConfig::InstanceSpecific::cpus() const { return (*Dictionary())[kCpus].asInt(); }
606 
607 static constexpr char kVcpuInfo[] = "vcpu_config_path";
set_vcpu_config_path(const std::string & vcpu_config_path)608 void CuttlefishConfig::MutableInstanceSpecific::set_vcpu_config_path(
609     const std::string& vcpu_config_path) {
610   (*Dictionary())[kVcpuInfo] = vcpu_config_path;
611 }
vcpu_config_path() const612 std::string CuttlefishConfig::InstanceSpecific::vcpu_config_path() const {
613   return (*Dictionary())[kVcpuInfo].asString();
614 }
615 
616 static constexpr char kDataPolicy[] = "data_policy";
set_data_policy(const std::string & data_policy)617 void CuttlefishConfig::MutableInstanceSpecific::set_data_policy(
618     const std::string& data_policy) {
619   (*Dictionary())[kDataPolicy] = data_policy;
620 }
data_policy() const621 std::string CuttlefishConfig::InstanceSpecific::data_policy() const {
622   return (*Dictionary())[kDataPolicy].asString();
623 }
624 
625 static constexpr char kBlankDataImageMb[] = "blank_data_image_mb";
set_blank_data_image_mb(int blank_data_image_mb)626 void CuttlefishConfig::MutableInstanceSpecific::set_blank_data_image_mb(
627     int blank_data_image_mb) {
628   (*Dictionary())[kBlankDataImageMb] = blank_data_image_mb;
629 }
blank_data_image_mb() const630 int CuttlefishConfig::InstanceSpecific::blank_data_image_mb() const {
631   return (*Dictionary())[kBlankDataImageMb].asInt();
632 }
633 
634 static constexpr char kGdbPort[] = "gdb_port";
set_gdb_port(int port)635 void CuttlefishConfig::MutableInstanceSpecific::set_gdb_port(int port) {
636   (*Dictionary())[kGdbPort] = port;
637 }
gdb_port() const638 int CuttlefishConfig::InstanceSpecific::gdb_port() const {
639   return (*Dictionary())[kGdbPort].asInt();
640 }
641 
642 static constexpr char kMemoryMb[] = "memory_mb";
memory_mb() const643 int CuttlefishConfig::InstanceSpecific::memory_mb() const {
644   return (*Dictionary())[kMemoryMb].asInt();
645 }
set_memory_mb(int memory_mb)646 void CuttlefishConfig::MutableInstanceSpecific::set_memory_mb(int memory_mb) {
647   (*Dictionary())[kMemoryMb] = memory_mb;
648 }
649 
650 static constexpr char kDdrMemMb[] = "ddr_mem_mb";
ddr_mem_mb() const651 int CuttlefishConfig::InstanceSpecific::ddr_mem_mb() const {
652   return (*Dictionary())[kDdrMemMb].asInt();
653 }
set_ddr_mem_mb(int ddr_mem_mb)654 void CuttlefishConfig::MutableInstanceSpecific::set_ddr_mem_mb(int ddr_mem_mb) {
655   (*Dictionary())[kDdrMemMb] = ddr_mem_mb;
656 }
657 
658 static constexpr char kSetupWizardMode[] = "setupwizard_mode";
setupwizard_mode() const659 std::string CuttlefishConfig::InstanceSpecific::setupwizard_mode() const {
660   return (*Dictionary())[kSetupWizardMode].asString();
661 }
set_setupwizard_mode(const std::string & mode)662 Result<void> CuttlefishConfig::MutableInstanceSpecific::set_setupwizard_mode(
663     const std::string& mode) {
664   CF_EXPECT(ValidateSetupWizardMode(mode),
665             "setupwizard_mode flag has invalid value: " << mode);
666   (*Dictionary())[kSetupWizardMode] = mode;
667   return {};
668 }
669 
670 static constexpr char kUserdataFormat[] = "userdata_format";
userdata_format() const671 std::string CuttlefishConfig::InstanceSpecific::userdata_format() const {
672   return (*Dictionary())[kUserdataFormat].asString();
673 }
set_userdata_format(const std::string & userdata_format)674 void CuttlefishConfig::MutableInstanceSpecific::set_userdata_format(const std::string& userdata_format) {
675   auto fmt = userdata_format;
676   std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::tolower);
677   (*Dictionary())[kUserdataFormat] = fmt;
678 }
679 
680 static constexpr char kGuestEnforceSecurity[] = "guest_enforce_security";
set_guest_enforce_security(bool guest_enforce_security)681 void CuttlefishConfig::MutableInstanceSpecific::set_guest_enforce_security(bool guest_enforce_security) {
682   (*Dictionary())[kGuestEnforceSecurity] = guest_enforce_security;
683 }
guest_enforce_security() const684 bool CuttlefishConfig::InstanceSpecific::guest_enforce_security() const {
685   return (*Dictionary())[kGuestEnforceSecurity].asBool();
686 }
687 
688 static constexpr char kUseSdcard[] = "use_sdcard";
set_use_sdcard(bool use_sdcard)689 void CuttlefishConfig::MutableInstanceSpecific::set_use_sdcard(bool use_sdcard) {
690   (*Dictionary())[kUseSdcard] = use_sdcard;
691 }
use_sdcard() const692 bool CuttlefishConfig::InstanceSpecific::use_sdcard() const {
693   return (*Dictionary())[kUseSdcard].asBool();
694 }
695 
696 static constexpr char kPauseInBootloader[] = "pause_in_bootloader";
set_pause_in_bootloader(bool pause_in_bootloader)697 void CuttlefishConfig::MutableInstanceSpecific::set_pause_in_bootloader(bool pause_in_bootloader) {
698   (*Dictionary())[kPauseInBootloader] = pause_in_bootloader;
699 }
pause_in_bootloader() const700 bool CuttlefishConfig::InstanceSpecific::pause_in_bootloader() const {
701   return (*Dictionary())[kPauseInBootloader].asBool();
702 }
703 
704 static constexpr char kRunAsDaemon[] = "run_as_daemon";
run_as_daemon() const705 bool CuttlefishConfig::InstanceSpecific::run_as_daemon() const {
706   return (*Dictionary())[kRunAsDaemon].asBool();
707 }
set_run_as_daemon(bool run_as_daemon)708 void CuttlefishConfig::MutableInstanceSpecific::set_run_as_daemon(bool run_as_daemon) {
709   (*Dictionary())[kRunAsDaemon] = run_as_daemon;
710 }
711 
712 static constexpr char kEnableMinimalMode[] = "enable_minimal_mode";
enable_minimal_mode() const713 bool CuttlefishConfig::InstanceSpecific::enable_minimal_mode() const {
714   return (*Dictionary())[kEnableMinimalMode].asBool();
715 }
set_enable_minimal_mode(bool enable_minimal_mode)716 void CuttlefishConfig::MutableInstanceSpecific::set_enable_minimal_mode(
717     bool enable_minimal_mode) {
718   (*Dictionary())[kEnableMinimalMode] = enable_minimal_mode;
719 }
720 
721 static constexpr char kRunModemSimulator[] = "enable_modem_simulator";
enable_modem_simulator() const722 bool CuttlefishConfig::InstanceSpecific::enable_modem_simulator() const {
723   return (*Dictionary())[kRunModemSimulator].asBool();
724 }
set_enable_modem_simulator(bool enable_modem_simulator)725 void CuttlefishConfig::MutableInstanceSpecific::set_enable_modem_simulator(
726     bool enable_modem_simulator) {
727   (*Dictionary())[kRunModemSimulator] = enable_modem_simulator;
728 }
729 
730 static constexpr char kModemSimulatorInstanceNumber[] =
731     "modem_simulator_instance_number";
732 void CuttlefishConfig::MutableInstanceSpecific::
set_modem_simulator_instance_number(int instance_number)733     set_modem_simulator_instance_number(int instance_number) {
734   (*Dictionary())[kModemSimulatorInstanceNumber] = instance_number;
735 }
modem_simulator_instance_number() const736 int CuttlefishConfig::InstanceSpecific::modem_simulator_instance_number()
737     const {
738   return (*Dictionary())[kModemSimulatorInstanceNumber].asInt();
739 }
740 
741 static constexpr char kModemSimulatorSimType[] = "modem_simulator_sim_type";
set_modem_simulator_sim_type(int sim_type)742 void CuttlefishConfig::MutableInstanceSpecific::set_modem_simulator_sim_type(
743     int sim_type) {
744   (*Dictionary())[kModemSimulatorSimType] = sim_type;
745 }
modem_simulator_sim_type() const746 int CuttlefishConfig::InstanceSpecific::modem_simulator_sim_type() const {
747   return (*Dictionary())[kModemSimulatorSimType].asInt();
748 }
749 
750 static constexpr char kGpuMode[] = "gpu_mode";
gpu_mode() const751 std::string CuttlefishConfig::InstanceSpecific::gpu_mode() const {
752   return (*Dictionary())[kGpuMode].asString();
753 }
set_gpu_mode(const std::string & name)754 void CuttlefishConfig::MutableInstanceSpecific::set_gpu_mode(const std::string& name) {
755   (*Dictionary())[kGpuMode] = name;
756 }
757 
758 static constexpr char kGpuAngleFeatureOverridesEnabled[] =
759     "gpu_angle_feature_overrides_enabled";
760 std::string
gpu_angle_feature_overrides_enabled() const761 CuttlefishConfig::InstanceSpecific::gpu_angle_feature_overrides_enabled()
762     const {
763   return (*Dictionary())[kGpuAngleFeatureOverridesEnabled].asString();
764 }
765 void CuttlefishConfig::MutableInstanceSpecific::
set_gpu_angle_feature_overrides_enabled(const std::string & overrides)766     set_gpu_angle_feature_overrides_enabled(const std::string& overrides) {
767   (*Dictionary())[kGpuAngleFeatureOverridesEnabled] = overrides;
768 }
769 
770 static constexpr char kGpuAngleFeatureOverridesDisabled[] =
771     "gpu_angle_feature_overrides_disabled";
772 std::string
gpu_angle_feature_overrides_disabled() const773 CuttlefishConfig::InstanceSpecific::gpu_angle_feature_overrides_disabled()
774     const {
775   return (*Dictionary())[kGpuAngleFeatureOverridesDisabled].asString();
776 }
777 void CuttlefishConfig::MutableInstanceSpecific::
set_gpu_angle_feature_overrides_disabled(const std::string & overrides)778     set_gpu_angle_feature_overrides_disabled(const std::string& overrides) {
779   (*Dictionary())[kGpuAngleFeatureOverridesDisabled] = overrides;
780 }
781 
782 static constexpr char kGpuCaptureBinary[] = "gpu_capture_binary";
gpu_capture_binary() const783 std::string CuttlefishConfig::InstanceSpecific::gpu_capture_binary() const {
784   return (*Dictionary())[kGpuCaptureBinary].asString();
785 }
set_gpu_capture_binary(const std::string & name)786 void CuttlefishConfig::MutableInstanceSpecific::set_gpu_capture_binary(const std::string& name) {
787   (*Dictionary())[kGpuCaptureBinary] = name;
788 }
789 
790 static constexpr char kGpuGfxstreamTransport[] = "gpu_gfxstream_transport";
gpu_gfxstream_transport() const791 std::string CuttlefishConfig::InstanceSpecific::gpu_gfxstream_transport()
792     const {
793   return (*Dictionary())[kGpuGfxstreamTransport].asString();
794 }
set_gpu_gfxstream_transport(const std::string & transport)795 void CuttlefishConfig::MutableInstanceSpecific::set_gpu_gfxstream_transport(
796     const std::string& transport) {
797   (*Dictionary())[kGpuGfxstreamTransport] = transport;
798 }
799 
800 static constexpr char kGpuRendererFeatures[] = "gpu_renderer_features";
gpu_renderer_features() const801 std::string CuttlefishConfig::InstanceSpecific::gpu_renderer_features() const {
802   return (*Dictionary())[kGpuRendererFeatures].asString();
803 }
set_gpu_renderer_features(const std::string & transport)804 void CuttlefishConfig::MutableInstanceSpecific::set_gpu_renderer_features(
805     const std::string& transport) {
806   (*Dictionary())[kGpuRendererFeatures] = transport;
807 }
808 
809 static constexpr char kGpuContextTypes[] = "gpu_context_types";
gpu_context_types() const810 std::string CuttlefishConfig::InstanceSpecific::gpu_context_types() const {
811   return (*Dictionary())[kGpuContextTypes].asString();
812 }
set_gpu_context_types(const std::string & context_types)813 void CuttlefishConfig::MutableInstanceSpecific::set_gpu_context_types(
814     const std::string& context_types) {
815   (*Dictionary())[kGpuContextTypes] = context_types;
816 }
817 
818 static constexpr char kVulkanDriver[] = "guest_vulkan_driver";
guest_vulkan_driver() const819 std::string CuttlefishConfig::InstanceSpecific::guest_vulkan_driver() const {
820   return (*Dictionary())[kVulkanDriver].asString();
821 }
set_guest_vulkan_driver(const std::string & driver)822 void CuttlefishConfig::MutableInstanceSpecific::set_guest_vulkan_driver(
823     const std::string& driver) {
824   (*Dictionary())[kVulkanDriver] = driver;
825 }
826 
827 static constexpr char kGuestUsesBgraFramebuffers[] =
828     "guest_uses_bgra_framebuffers";
guest_uses_bgra_framebuffers() const829 bool CuttlefishConfig::InstanceSpecific::guest_uses_bgra_framebuffers() const {
830   return (*Dictionary())[kGuestUsesBgraFramebuffers].asBool();
831 }
832 void CuttlefishConfig::MutableInstanceSpecific::
set_guest_uses_bgra_framebuffers(bool uses_bgra)833     set_guest_uses_bgra_framebuffers(bool uses_bgra) {
834   (*Dictionary())[kGuestUsesBgraFramebuffers] = uses_bgra;
835 }
836 
837 static constexpr char kRestartSubprocesses[] = "restart_subprocesses";
restart_subprocesses() const838 bool CuttlefishConfig::InstanceSpecific::restart_subprocesses() const {
839   return (*Dictionary())[kRestartSubprocesses].asBool();
840 }
set_restart_subprocesses(bool restart_subprocesses)841 void CuttlefishConfig::MutableInstanceSpecific::set_restart_subprocesses(bool restart_subprocesses) {
842   (*Dictionary())[kRestartSubprocesses] = restart_subprocesses;
843 }
844 
845 static constexpr char kHWComposer[] = "hwcomposer";
hwcomposer() const846 std::string CuttlefishConfig::InstanceSpecific::hwcomposer() const {
847   return (*Dictionary())[kHWComposer].asString();
848 }
set_hwcomposer(const std::string & name)849 void CuttlefishConfig::MutableInstanceSpecific::set_hwcomposer(const std::string& name) {
850   (*Dictionary())[kHWComposer] = name;
851 }
852 
853 static constexpr char kEnableGpuUdmabuf[] = "enable_gpu_udmabuf";
set_enable_gpu_udmabuf(const bool enable_gpu_udmabuf)854 void CuttlefishConfig::MutableInstanceSpecific::set_enable_gpu_udmabuf(const bool enable_gpu_udmabuf) {
855   (*Dictionary())[kEnableGpuUdmabuf] = enable_gpu_udmabuf;
856 }
enable_gpu_udmabuf() const857 bool CuttlefishConfig::InstanceSpecific::enable_gpu_udmabuf() const {
858   return (*Dictionary())[kEnableGpuUdmabuf].asBool();
859 }
860 
861 static constexpr char kEnableGpuVhostUser[] = "enable_gpu_vhost_user";
set_enable_gpu_vhost_user(const bool enable_gpu_vhost_user)862 void CuttlefishConfig::MutableInstanceSpecific::set_enable_gpu_vhost_user(
863     const bool enable_gpu_vhost_user) {
864   (*Dictionary())[kEnableGpuVhostUser] = enable_gpu_vhost_user;
865 }
enable_gpu_vhost_user() const866 bool CuttlefishConfig::InstanceSpecific::enable_gpu_vhost_user() const {
867   return (*Dictionary())[kEnableGpuVhostUser].asBool();
868 }
869 
870 static constexpr char kEnableGpuExternalBlob[] = "enable_gpu_external_blob";
set_enable_gpu_external_blob(const bool enable_gpu_external_blob)871 void CuttlefishConfig::MutableInstanceSpecific::set_enable_gpu_external_blob(
872     const bool enable_gpu_external_blob) {
873   (*Dictionary())[kEnableGpuExternalBlob] = enable_gpu_external_blob;
874 }
enable_gpu_external_blob() const875 bool CuttlefishConfig::InstanceSpecific::enable_gpu_external_blob() const {
876   return (*Dictionary())[kEnableGpuExternalBlob].asBool();
877 }
878 
879 static constexpr char kEnableGpuSystemBlob[] = "enable_gpu_system_blob";
set_enable_gpu_system_blob(const bool enable_gpu_system_blob)880 void CuttlefishConfig::MutableInstanceSpecific::set_enable_gpu_system_blob(
881     const bool enable_gpu_system_blob) {
882   (*Dictionary())[kEnableGpuSystemBlob] = enable_gpu_system_blob;
883 }
enable_gpu_system_blob() const884 bool CuttlefishConfig::InstanceSpecific::enable_gpu_system_blob() const {
885   return (*Dictionary())[kEnableGpuSystemBlob].asBool();
886 }
887 
888 static constexpr char kEnableAudio[] = "enable_audio";
set_enable_audio(bool enable)889 void CuttlefishConfig::MutableInstanceSpecific::set_enable_audio(bool enable) {
890   (*Dictionary())[kEnableAudio] = enable;
891 }
enable_audio() const892 bool CuttlefishConfig::InstanceSpecific::enable_audio() const {
893   return (*Dictionary())[kEnableAudio].asBool();
894 }
895 
896 static constexpr char kEnableMouse[] = "enable_mouse";
set_enable_mouse(bool enable)897 void CuttlefishConfig::MutableInstanceSpecific::set_enable_mouse(bool enable) {
898   (*Dictionary())[kEnableMouse] = enable;
899 }
enable_mouse() const900 bool CuttlefishConfig::InstanceSpecific::enable_mouse() const {
901   return (*Dictionary())[kEnableMouse].asBool();
902 }
903 
904 static constexpr char kEnableGnssGrpcProxy[] = "enable_gnss_grpc_proxy";
set_enable_gnss_grpc_proxy(const bool enable_gnss_grpc_proxy)905 void CuttlefishConfig::MutableInstanceSpecific::set_enable_gnss_grpc_proxy(const bool enable_gnss_grpc_proxy) {
906   (*Dictionary())[kEnableGnssGrpcProxy] = enable_gnss_grpc_proxy;
907 }
enable_gnss_grpc_proxy() const908 bool CuttlefishConfig::InstanceSpecific::enable_gnss_grpc_proxy() const {
909   return (*Dictionary())[kEnableGnssGrpcProxy].asBool();
910 }
911 
912 static constexpr char kEnableBootAnimation[] = "enable_bootanimation";
enable_bootanimation() const913 bool CuttlefishConfig::InstanceSpecific::enable_bootanimation() const {
914   return (*Dictionary())[kEnableBootAnimation].asBool();
915 }
set_enable_bootanimation(bool enable_bootanimation)916 void CuttlefishConfig::MutableInstanceSpecific::set_enable_bootanimation(
917     bool enable_bootanimation) {
918   (*Dictionary())[kEnableBootAnimation] = enable_bootanimation;
919 }
920 
921 static constexpr char kEnableUsb[] = "enable_usb";
set_enable_usb(bool enable)922 void CuttlefishConfig::MutableInstanceSpecific::set_enable_usb(bool enable) {
923   (*Dictionary())[kEnableUsb] = enable;
924 }
enable_usb() const925 bool CuttlefishConfig::InstanceSpecific::enable_usb() const {
926   return (*Dictionary())[kEnableUsb].asBool();
927 }
928 
929 static constexpr char kExtraBootconfigArgsInstanced[] = "extra_bootconfig_args";
930 std::vector<std::string>
extra_bootconfig_args() const931 CuttlefishConfig::InstanceSpecific::extra_bootconfig_args() const {
932   std::string extra_bootconfig_args_str =
933       (*Dictionary())[kExtraBootconfigArgsInstanced].asString();
934   std::vector<std::string> bootconfig;
935   if (!extra_bootconfig_args_str.empty()) {
936     for (const auto& arg :
937          android::base::Split(extra_bootconfig_args_str, " ")) {
938       bootconfig.push_back(arg);
939     }
940   }
941   return bootconfig;
942 }
943 
set_extra_bootconfig_args(const std::string & transport)944 void CuttlefishConfig::MutableInstanceSpecific::set_extra_bootconfig_args(
945     const std::string& transport) {
946   (*Dictionary())[kExtraBootconfigArgsInstanced] = transport;
947 }
948 
949 static constexpr char kRecordScreen[] = "record_screen";
set_record_screen(bool record_screen)950 void CuttlefishConfig::MutableInstanceSpecific::set_record_screen(
951     bool record_screen) {
952   (*Dictionary())[kRecordScreen] = record_screen;
953 }
record_screen() const954 bool CuttlefishConfig::InstanceSpecific::record_screen() const {
955   return (*Dictionary())[kRecordScreen].asBool();
956 }
957 
958 static constexpr char kGem5DebugFile[] = "gem5_debug_file";
gem5_debug_file() const959 std::string CuttlefishConfig::InstanceSpecific::gem5_debug_file() const {
960   return (*Dictionary())[kGem5DebugFile].asString();
961 }
set_gem5_debug_file(const std::string & gem5_debug_file)962 void CuttlefishConfig::MutableInstanceSpecific::set_gem5_debug_file(const std::string& gem5_debug_file) {
963   (*Dictionary())[kGem5DebugFile] = gem5_debug_file;
964 }
965 
966 static constexpr char kProtectedVm[] = "protected_vm";
set_protected_vm(bool protected_vm)967 void CuttlefishConfig::MutableInstanceSpecific::set_protected_vm(bool protected_vm) {
968   (*Dictionary())[kProtectedVm] = protected_vm;
969 }
protected_vm() const970 bool CuttlefishConfig::InstanceSpecific::protected_vm() const {
971   return (*Dictionary())[kProtectedVm].asBool();
972 }
973 
974 static constexpr char kMte[] = "mte";
set_mte(bool mte)975 void CuttlefishConfig::MutableInstanceSpecific::set_mte(bool mte) {
976   (*Dictionary())[kMte] = mte;
977 }
mte() const978 bool CuttlefishConfig::InstanceSpecific::mte() const {
979   return (*Dictionary())[kMte].asBool();
980 }
981 
982 static constexpr char kEnableKernelLog[] = "enable_kernel_log";
set_enable_kernel_log(bool enable_kernel_log)983 void CuttlefishConfig::MutableInstanceSpecific::set_enable_kernel_log(bool enable_kernel_log) {
984   (*Dictionary())[kEnableKernelLog] = enable_kernel_log;
985 }
enable_kernel_log() const986 bool CuttlefishConfig::InstanceSpecific::enable_kernel_log() const {
987   return (*Dictionary())[kEnableKernelLog].asBool();
988 }
989 
990 static constexpr char kBootSlot[] = "boot_slot";
set_boot_slot(const std::string & boot_slot)991 void CuttlefishConfig::MutableInstanceSpecific::set_boot_slot(const std::string& boot_slot) {
992   (*Dictionary())[kBootSlot] = boot_slot;
993 }
boot_slot() const994 std::string CuttlefishConfig::InstanceSpecific::boot_slot() const {
995   return (*Dictionary())[kBootSlot].asString();
996 }
997 
998 static constexpr char kFailFast[] = "fail_fast";
set_fail_fast(bool fail_fast)999 void CuttlefishConfig::MutableInstanceSpecific::set_fail_fast(bool fail_fast) {
1000   (*Dictionary())[kFailFast] = fail_fast;
1001 }
fail_fast() const1002 bool CuttlefishConfig::InstanceSpecific::fail_fast() const {
1003   return (*Dictionary())[kFailFast].asBool();
1004 }
1005 
1006 static constexpr char kVhostUserBlock[] = "vhost_user_block";
set_vhost_user_block(bool block)1007 void CuttlefishConfig::MutableInstanceSpecific::set_vhost_user_block(
1008     bool block) {
1009   (*Dictionary())[kVhostUserBlock] = block;
1010 }
vhost_user_block() const1011 bool CuttlefishConfig::InstanceSpecific::vhost_user_block() const {
1012   return (*Dictionary())[kVhostUserBlock].asBool();
1013 }
1014 
1015 static constexpr char kEnableWebRTC[] = "enable_webrtc";
set_enable_webrtc(bool enable_webrtc)1016 void CuttlefishConfig::MutableInstanceSpecific::set_enable_webrtc(bool enable_webrtc) {
1017   (*Dictionary())[kEnableWebRTC] = enable_webrtc;
1018 }
enable_webrtc() const1019 bool CuttlefishConfig::InstanceSpecific::enable_webrtc() const {
1020   return (*Dictionary())[kEnableWebRTC].asBool();
1021 }
1022 
1023 static constexpr char kWebRTCAssetsDir[] = "webrtc_assets_dir";
set_webrtc_assets_dir(const std::string & webrtc_assets_dir)1024 void CuttlefishConfig::MutableInstanceSpecific::set_webrtc_assets_dir(const std::string& webrtc_assets_dir) {
1025   (*Dictionary())[kWebRTCAssetsDir] = webrtc_assets_dir;
1026 }
webrtc_assets_dir() const1027 std::string CuttlefishConfig::InstanceSpecific::webrtc_assets_dir() const {
1028   return (*Dictionary())[kWebRTCAssetsDir].asString();
1029 }
1030 
1031 static constexpr char kWebrtcTcpPortRange[] = "webrtc_tcp_port_range";
set_webrtc_tcp_port_range(std::pair<uint16_t,uint16_t> range)1032 void CuttlefishConfig::MutableInstanceSpecific::set_webrtc_tcp_port_range(
1033     std::pair<uint16_t, uint16_t> range) {
1034   Json::Value arr(Json::ValueType::arrayValue);
1035   arr[0] = range.first;
1036   arr[1] = range.second;
1037   (*Dictionary())[kWebrtcTcpPortRange] = arr;
1038 }
webrtc_tcp_port_range() const1039 std::pair<uint16_t, uint16_t> CuttlefishConfig::InstanceSpecific::webrtc_tcp_port_range() const {
1040   std::pair<uint16_t, uint16_t> ret;
1041   ret.first = (*Dictionary())[kWebrtcTcpPortRange][0].asInt();
1042   ret.second = (*Dictionary())[kWebrtcTcpPortRange][1].asInt();
1043   return ret;
1044 }
1045 
1046 static constexpr char kWebrtcUdpPortRange[] = "webrtc_udp_port_range";
set_webrtc_udp_port_range(std::pair<uint16_t,uint16_t> range)1047 void CuttlefishConfig::MutableInstanceSpecific::set_webrtc_udp_port_range(
1048     std::pair<uint16_t, uint16_t> range) {
1049   Json::Value arr(Json::ValueType::arrayValue);
1050   arr[0] = range.first;
1051   arr[1] = range.second;
1052   (*Dictionary())[kWebrtcUdpPortRange] = arr;
1053 }
webrtc_udp_port_range() const1054 std::pair<uint16_t, uint16_t> CuttlefishConfig::InstanceSpecific::webrtc_udp_port_range() const {
1055   std::pair<uint16_t, uint16_t> ret;
1056   ret.first = (*Dictionary())[kWebrtcUdpPortRange][0].asInt();
1057   ret.second = (*Dictionary())[kWebrtcUdpPortRange][1].asInt();
1058   return ret;
1059 }
1060 
1061 static constexpr char kGrpcConfig[] = "grpc_config";
grpc_socket_path() const1062 std::string CuttlefishConfig::InstanceSpecific::grpc_socket_path() const {
1063   return (*Dictionary())[kGrpcConfig].asString();
1064 }
1065 
set_grpc_socket_path(const std::string & socket_path)1066 void CuttlefishConfig::MutableInstanceSpecific::set_grpc_socket_path(
1067     const std::string& socket_path) {
1068   (*Dictionary())[kGrpcConfig] = socket_path;
1069 }
1070 
1071 static constexpr char kSmt[] = "smt";
set_smt(bool smt)1072 void CuttlefishConfig::MutableInstanceSpecific::set_smt(bool smt) {
1073   (*Dictionary())[kSmt] = smt;
1074 }
smt() const1075 bool CuttlefishConfig::InstanceSpecific::smt() const {
1076   return (*Dictionary())[kSmt].asBool();
1077 }
1078 
1079 static constexpr char kCrosvmBinary[] = "crosvm_binary";
crosvm_binary() const1080 std::string CuttlefishConfig::InstanceSpecific::crosvm_binary() const {
1081   return (*Dictionary())[kCrosvmBinary].asString();
1082 }
set_crosvm_binary(const std::string & crosvm_binary)1083 void CuttlefishConfig::MutableInstanceSpecific::set_crosvm_binary(
1084     const std::string& crosvm_binary) {
1085   (*Dictionary())[kCrosvmBinary] = crosvm_binary;
1086 }
1087 
SetPath(const std::string & key,const std::string & path)1088 void CuttlefishConfig::MutableInstanceSpecific::SetPath(
1089     const std::string& key, const std::string& path) {
1090   if (!path.empty()) {
1091     (*Dictionary())[key] = AbsolutePath(path);
1092   }
1093 }
1094 
1095 static constexpr char kSeccompPolicyDir[] = "seccomp_policy_dir";
set_seccomp_policy_dir(const std::string & seccomp_policy_dir)1096 void CuttlefishConfig::MutableInstanceSpecific::set_seccomp_policy_dir(
1097     const std::string& seccomp_policy_dir) {
1098   if (seccomp_policy_dir.empty()) {
1099     (*Dictionary())[kSeccompPolicyDir] = seccomp_policy_dir;
1100     return;
1101   }
1102   SetPath(kSeccompPolicyDir, seccomp_policy_dir);
1103 }
seccomp_policy_dir() const1104 std::string CuttlefishConfig::InstanceSpecific::seccomp_policy_dir() const {
1105   return (*Dictionary())[kSeccompPolicyDir].asString();
1106 }
1107 
1108 static constexpr char kQemuBinaryDir[] = "qemu_binary_dir";
qemu_binary_dir() const1109 std::string CuttlefishConfig::InstanceSpecific::qemu_binary_dir() const {
1110   return (*Dictionary())[kQemuBinaryDir].asString();
1111 }
set_qemu_binary_dir(const std::string & qemu_binary_dir)1112 void CuttlefishConfig::MutableInstanceSpecific::set_qemu_binary_dir(
1113     const std::string& qemu_binary_dir) {
1114   (*Dictionary())[kQemuBinaryDir] = qemu_binary_dir;
1115 }
1116 
1117 static constexpr char kVhostNet[] = "vhost_net";
set_vhost_net(bool vhost_net)1118 void CuttlefishConfig::MutableInstanceSpecific::set_vhost_net(bool vhost_net) {
1119   (*Dictionary())[kVhostNet] = vhost_net;
1120 }
vhost_net() const1121 bool CuttlefishConfig::InstanceSpecific::vhost_net() const {
1122   return (*Dictionary())[kVhostNet].asBool();
1123 }
1124 
1125 static constexpr char kOpenThreadNodeId[] = "openthread_node_id";
set_openthread_node_id(int node_id)1126 void CuttlefishConfig::MutableInstanceSpecific::set_openthread_node_id(int node_id) {
1127   (*Dictionary())[kOpenThreadNodeId] = node_id;
1128 }
openthread_node_id() const1129 int CuttlefishConfig::InstanceSpecific::openthread_node_id() const {
1130   return (*Dictionary())[kOpenThreadNodeId].asInt();
1131 }
1132 
1133 static constexpr char kVhostUserVsock[] = "vhost_user_vsock";
set_vhost_user_vsock(bool vhost_user_vsock)1134 void CuttlefishConfig::MutableInstanceSpecific::set_vhost_user_vsock(
1135     bool vhost_user_vsock) {
1136   (*Dictionary())[kVhostUserVsock] = vhost_user_vsock;
1137 }
vhost_user_vsock() const1138 bool CuttlefishConfig::InstanceSpecific::vhost_user_vsock() const {
1139   return (*Dictionary())[kVhostUserVsock].asBool();
1140 }
1141 
1142 static constexpr char kRilDns[] = "ril_dns";
set_ril_dns(const std::string & ril_dns)1143 void CuttlefishConfig::MutableInstanceSpecific::set_ril_dns(const std::string& ril_dns) {
1144   (*Dictionary())[kRilDns] = ril_dns;
1145 }
ril_dns() const1146 std::string CuttlefishConfig::InstanceSpecific::ril_dns() const {
1147   return (*Dictionary())[kRilDns].asString();
1148 }
1149 
1150 static constexpr char kRilIpaddr[] = "ril_ipaddr";
set_ril_ipaddr(const std::string & ril_ipaddr)1151 void CuttlefishConfig::MutableInstanceSpecific::set_ril_ipaddr(
1152     const std::string& ril_ipaddr) {
1153   (*Dictionary())[kRilIpaddr] = ril_ipaddr;
1154 }
ril_ipaddr() const1155 std::string CuttlefishConfig::InstanceSpecific::ril_ipaddr() const {
1156   return (*Dictionary())[kRilIpaddr].asString();
1157 }
1158 
1159 static constexpr char kRilGateway[] = "ril_gateway";
set_ril_gateway(const std::string & ril_gateway)1160 void CuttlefishConfig::MutableInstanceSpecific::set_ril_gateway(
1161     const std::string& ril_gateway) {
1162   (*Dictionary())[kRilGateway] = ril_gateway;
1163 }
ril_gateway() const1164 std::string CuttlefishConfig::InstanceSpecific::ril_gateway() const {
1165   return (*Dictionary())[kRilGateway].asString();
1166 }
1167 
1168 static constexpr char kRilBroadcast[] = "ril_broadcast";
set_ril_broadcast(const std::string & ril_broadcast)1169 void CuttlefishConfig::MutableInstanceSpecific::set_ril_broadcast(
1170     const std::string& ril_broadcast) {
1171   (*Dictionary())[kRilBroadcast] = ril_broadcast;
1172 }
ril_broadcast() const1173 std::string CuttlefishConfig::InstanceSpecific::ril_broadcast() const {
1174   return (*Dictionary())[kRilBroadcast].asString();
1175 }
1176 
1177 static constexpr char kRilPrefixlen[] = "ril_prefixlen";
set_ril_prefixlen(uint8_t ril_prefixlen)1178 void CuttlefishConfig::MutableInstanceSpecific::set_ril_prefixlen(
1179     uint8_t ril_prefixlen) {
1180   (*Dictionary())[kRilPrefixlen] = static_cast<Json::UInt>(ril_prefixlen);
1181 }
ril_prefixlen() const1182 uint8_t CuttlefishConfig::InstanceSpecific::ril_prefixlen() const {
1183   return static_cast<uint8_t>((*Dictionary())[kRilPrefixlen].asUInt());
1184 }
1185 
1186 static constexpr char kDisplayConfigs[] = "display_configs";
1187 static constexpr char kXRes[] = "x_res";
1188 static constexpr char kYRes[] = "y_res";
1189 static constexpr char kDpi[] = "dpi";
1190 static constexpr char kRefreshRateHz[] = "refresh_rate_hz";
1191 std::vector<CuttlefishConfig::DisplayConfig>
display_configs() const1192 CuttlefishConfig::InstanceSpecific::display_configs() const {
1193   std::vector<DisplayConfig> display_configs;
1194   for (auto& display_config_json : (*Dictionary())[kDisplayConfigs]) {
1195     DisplayConfig display_config = {};
1196     display_config.width = display_config_json[kXRes].asInt();
1197     display_config.height = display_config_json[kYRes].asInt();
1198     display_config.dpi = display_config_json[kDpi].asInt();
1199     display_config.refresh_rate_hz =
1200         display_config_json[kRefreshRateHz].asInt();
1201     display_configs.emplace_back(display_config);
1202   }
1203   return display_configs;
1204 }
set_display_configs(const std::vector<DisplayConfig> & display_configs)1205 void CuttlefishConfig::MutableInstanceSpecific::set_display_configs(
1206     const std::vector<DisplayConfig>& display_configs) {
1207   Json::Value display_configs_json(Json::arrayValue);
1208 
1209   for (const DisplayConfig& display_configs : display_configs) {
1210     Json::Value display_config_json(Json::objectValue);
1211     display_config_json[kXRes] = display_configs.width;
1212     display_config_json[kYRes] = display_configs.height;
1213     display_config_json[kDpi] = display_configs.dpi;
1214     display_config_json[kRefreshRateHz] = display_configs.refresh_rate_hz;
1215     display_configs_json.append(display_config_json);
1216   }
1217 
1218   (*Dictionary())[kDisplayConfigs] = display_configs_json;
1219 }
1220 
1221 static constexpr char kTouchpadConfigs[] = "touchpad_configs";
1222 
Serialize(const CuttlefishConfig::TouchpadConfig & config)1223 Json::Value CuttlefishConfig::TouchpadConfig::Serialize(
1224     const CuttlefishConfig::TouchpadConfig& config) {
1225   Json::Value config_json(Json::objectValue);
1226   config_json[kXRes] = config.width;
1227   config_json[kYRes] = config.height;
1228 
1229   return config_json;
1230 }
1231 
Deserialize(const Json::Value & config_json)1232 CuttlefishConfig::TouchpadConfig CuttlefishConfig::TouchpadConfig::Deserialize(
1233     const Json::Value& config_json) {
1234   TouchpadConfig touchpad_config = {};
1235   touchpad_config.width = config_json[kXRes].asInt();
1236   touchpad_config.height = config_json[kYRes].asInt();
1237 
1238   return touchpad_config;
1239 }
1240 
1241 std::vector<CuttlefishConfig::TouchpadConfig>
touchpad_configs() const1242 CuttlefishConfig::InstanceSpecific::touchpad_configs() const {
1243   std::vector<TouchpadConfig> touchpad_configs;
1244   for (auto& touchpad_config_json : (*Dictionary())[kTouchpadConfigs]) {
1245     auto touchpad_config = TouchpadConfig::Deserialize(touchpad_config_json);
1246     touchpad_configs.emplace_back(touchpad_config);
1247   }
1248   return touchpad_configs;
1249 }
set_touchpad_configs(const std::vector<TouchpadConfig> & touchpad_configs)1250 void CuttlefishConfig::MutableInstanceSpecific::set_touchpad_configs(
1251     const std::vector<TouchpadConfig>& touchpad_configs) {
1252   Json::Value touchpad_configs_json(Json::arrayValue);
1253 
1254   for (const TouchpadConfig& touchpad_config : touchpad_configs) {
1255     touchpad_configs_json.append(TouchpadConfig::Serialize(touchpad_config));
1256   }
1257 
1258   (*Dictionary())[kTouchpadConfigs] = touchpad_configs_json;
1259 }
1260 
1261 static constexpr char kTargetArch[] = "target_arch";
set_target_arch(Arch target_arch)1262 void CuttlefishConfig::MutableInstanceSpecific::set_target_arch(
1263     Arch target_arch) {
1264   (*Dictionary())[kTargetArch] = static_cast<int>(target_arch);
1265 }
target_arch() const1266 Arch CuttlefishConfig::InstanceSpecific::target_arch() const {
1267   return static_cast<Arch>((*Dictionary())[kTargetArch].asInt());
1268 }
1269 
1270 static constexpr char kEnableSandbox[] = "enable_sandbox";
set_enable_sandbox(const bool enable_sandbox)1271 void CuttlefishConfig::MutableInstanceSpecific::set_enable_sandbox(const bool enable_sandbox) {
1272   (*Dictionary())[kEnableSandbox] = enable_sandbox;
1273 }
enable_sandbox() const1274 bool CuttlefishConfig::InstanceSpecific::enable_sandbox() const {
1275   return (*Dictionary())[kEnableSandbox].asBool();
1276 }
1277 static constexpr char kEnableVirtiofs[] = "enable_virtiofs";
set_enable_virtiofs(const bool enable_virtiofs)1278 void CuttlefishConfig::MutableInstanceSpecific::set_enable_virtiofs(
1279     const bool enable_virtiofs) {
1280   (*Dictionary())[kEnableVirtiofs] = enable_virtiofs;
1281 }
enable_virtiofs() const1282 bool CuttlefishConfig::InstanceSpecific::enable_virtiofs() const {
1283   return (*Dictionary())[kEnableVirtiofs].asBool();
1284 }
1285 static constexpr char kConsole[] = "console";
set_console(bool console)1286 void CuttlefishConfig::MutableInstanceSpecific::set_console(bool console) {
1287   (*Dictionary())[kConsole] = console;
1288 }
console() const1289 bool CuttlefishConfig::InstanceSpecific::console() const {
1290   return (*Dictionary())[kConsole].asBool();
1291 }
console_dev() const1292 std::string CuttlefishConfig::InstanceSpecific::console_dev() const {
1293   auto can_use_virtio_console = !kgdb() && !use_bootloader();
1294   std::string console_dev;
1295   if (can_use_virtio_console || config_->vm_manager() == VmmMode::kGem5) {
1296     // If kgdb and the bootloader are disabled, the Android serial console
1297     // spawns on a virtio-console port. If the bootloader is enabled, virtio
1298     // console can't be used since uboot doesn't support it.
1299     console_dev = "hvc1";
1300   } else {
1301     // QEMU and Gem5 emulate pl011 on ARM/ARM64, but QEMU and crosvm on other
1302     // architectures emulate ns16550a/uart8250 instead.
1303     Arch target = target_arch();
1304     if ((target == Arch::Arm64 || target == Arch::Arm) &&
1305         config_->vm_manager() != VmmMode::kCrosvm) {
1306       console_dev = "ttyAMA0";
1307     } else {
1308       console_dev = "ttyS0";
1309     }
1310   }
1311   return console_dev;
1312 }
1313 
logcat_pipe_name() const1314 std::string CuttlefishConfig::InstanceSpecific::logcat_pipe_name() const {
1315   return AbsolutePath(PerInstanceInternalPath("logcat-pipe"));
1316 }
1317 
restore_adbd_pipe_name() const1318 std::string CuttlefishConfig::InstanceSpecific::restore_adbd_pipe_name() const {
1319   return AbsolutePath(PerInstanceInternalPath("restore-pipe-adbd"));
1320 }
1321 
access_kregistry_path() const1322 std::string CuttlefishConfig::InstanceSpecific::access_kregistry_path() const {
1323   return AbsolutePath(PerInstancePath("access-kregistry"));
1324 }
1325 
hwcomposer_pmem_path() const1326 std::string CuttlefishConfig::InstanceSpecific::hwcomposer_pmem_path() const {
1327   return AbsolutePath(PerInstancePath("hwcomposer-pmem"));
1328 }
1329 
pstore_path() const1330 std::string CuttlefishConfig::InstanceSpecific::pstore_path() const {
1331   return AbsolutePath(PerInstancePath("pstore"));
1332 }
1333 
pflash_path() const1334 std::string CuttlefishConfig::InstanceSpecific::pflash_path() const {
1335   return AbsolutePath(PerInstancePath("pflash.img"));
1336 }
1337 
console_path() const1338 std::string CuttlefishConfig::InstanceSpecific::console_path() const {
1339   return AbsolutePath(PerInstancePath("console"));
1340 }
1341 
logcat_path() const1342 std::string CuttlefishConfig::InstanceSpecific::logcat_path() const {
1343   return AbsolutePath(PerInstanceLogPath("logcat"));
1344 }
1345 
launcher_monitor_socket_path() const1346 std::string CuttlefishConfig::InstanceSpecific::launcher_monitor_socket_path()
1347     const {
1348   return AbsolutePath(PerInstanceUdsPath("launcher_monitor.sock"));
1349 }
1350 
1351 static constexpr char kModemSimulatorPorts[] = "modem_simulator_ports";
modem_simulator_ports() const1352 std::string CuttlefishConfig::InstanceSpecific::modem_simulator_ports() const {
1353   return (*Dictionary())[kModemSimulatorPorts].asString();
1354 }
set_modem_simulator_ports(const std::string & modem_simulator_ports)1355 void CuttlefishConfig::MutableInstanceSpecific::set_modem_simulator_ports(
1356     const std::string& modem_simulator_ports) {
1357   (*Dictionary())[kModemSimulatorPorts] = modem_simulator_ports;
1358 }
1359 
launcher_log_path() const1360 std::string CuttlefishConfig::InstanceSpecific::launcher_log_path() const {
1361   return AbsolutePath(PerInstanceLogPath("launcher.log"));
1362 }
1363 
metadata_image() const1364 std::string CuttlefishConfig::InstanceSpecific::metadata_image() const {
1365   return AbsolutePath(PerInstancePath("metadata.img"));
1366 }
1367 
misc_image() const1368 std::string CuttlefishConfig::InstanceSpecific::misc_image() const {
1369   return AbsolutePath(PerInstancePath("misc.img"));
1370 }
1371 
sdcard_path() const1372 std::string CuttlefishConfig::InstanceSpecific::sdcard_path() const {
1373   return AbsolutePath(PerInstancePath("sdcard.img"));
1374 }
1375 
sdcard_overlay_path() const1376 std::string CuttlefishConfig::InstanceSpecific::sdcard_overlay_path() const {
1377   return AbsolutePath(PerInstancePath("sdcard_overlay.img"));
1378 }
1379 
persistent_composite_disk_path() const1380 std::string CuttlefishConfig::InstanceSpecific::persistent_composite_disk_path()
1381     const {
1382   return AbsolutePath(PerInstancePath("persistent_composite.img"));
1383 }
1384 
1385 std::string
persistent_composite_overlay_path() const1386 CuttlefishConfig::InstanceSpecific::persistent_composite_overlay_path() const {
1387   return AbsolutePath(PerInstancePath("persistent_composite_overlay.img"));
1388 }
1389 
persistent_ap_composite_disk_path() const1390 std::string CuttlefishConfig::InstanceSpecific::persistent_ap_composite_disk_path()
1391     const {
1392   return AbsolutePath(PerInstancePath("ap_persistent_composite.img"));
1393 }
1394 
1395 std::string
persistent_ap_composite_overlay_path() const1396 CuttlefishConfig::InstanceSpecific::persistent_ap_composite_overlay_path()
1397     const {
1398   return AbsolutePath(PerInstancePath("ap_persistent_composite_overlay.img"));
1399 }
1400 
os_composite_disk_path() const1401 std::string CuttlefishConfig::InstanceSpecific::os_composite_disk_path()
1402     const {
1403   return AbsolutePath(PerInstancePath("os_composite.img"));
1404 }
1405 
ap_composite_disk_path() const1406 std::string CuttlefishConfig::InstanceSpecific::ap_composite_disk_path()
1407     const {
1408   return AbsolutePath(PerInstancePath("ap_composite.img"));
1409 }
1410 
vbmeta_path() const1411 std::string CuttlefishConfig::InstanceSpecific::vbmeta_path() const {
1412   return AbsolutePath(PerInstancePath("persistent_vbmeta.img"));
1413 }
1414 
ap_vbmeta_path() const1415 std::string CuttlefishConfig::InstanceSpecific::ap_vbmeta_path() const {
1416   return AbsolutePath(PerInstancePath("ap_vbmeta.img"));
1417 }
1418 
uboot_env_image_path() const1419 std::string CuttlefishConfig::InstanceSpecific::uboot_env_image_path() const {
1420   return AbsolutePath(PerInstancePath("uboot_env.img"));
1421 }
1422 
ap_uboot_env_image_path() const1423 std::string CuttlefishConfig::InstanceSpecific::ap_uboot_env_image_path() const {
1424   return AbsolutePath(PerInstancePath("ap_uboot_env.img"));
1425 }
1426 
chromeos_state_image() const1427 std::string CuttlefishConfig::InstanceSpecific::chromeos_state_image() const {
1428   return AbsolutePath(PerInstancePath("chromeos_state.img"));
1429 }
1430 
esp_image_path() const1431 std::string CuttlefishConfig::InstanceSpecific::esp_image_path() const {
1432   return AbsolutePath(PerInstancePath("esp.img"));
1433 }
1434 
ap_esp_image_path() const1435 std::string CuttlefishConfig::InstanceSpecific::ap_esp_image_path() const {
1436   return AbsolutePath(PerInstancePath("ap_esp.img"));
1437 }
1438 
otheros_esp_grub_config() const1439 std::string CuttlefishConfig::InstanceSpecific::otheros_esp_grub_config() const {
1440   return AbsolutePath(PerInstancePath("grub.cfg"));
1441 }
1442 
ap_esp_grub_config() const1443 std::string CuttlefishConfig::InstanceSpecific::ap_esp_grub_config() const {
1444   return AbsolutePath(PerInstancePath("ap_grub.cfg"));
1445 }
1446 
1447 static constexpr char kMobileBridgeName[] = "mobile_bridge_name";
1448 
audio_server_path() const1449 std::string CuttlefishConfig::InstanceSpecific::audio_server_path() const {
1450   return AbsolutePath(PerInstanceInternalUdsPath("audio_server.sock"));
1451 }
1452 
boot_flow() const1453 CuttlefishConfig::InstanceSpecific::BootFlow CuttlefishConfig::InstanceSpecific::boot_flow() const {
1454   const bool android_efi_loader_flow_used = !android_efi_loader().empty();
1455 
1456   const bool chromeos_disk_flow_used = !chromeos_disk().empty();
1457 
1458   const bool chromeos_flow_used =
1459       !chromeos_kernel_path().empty() || !chromeos_root_image().empty();
1460 
1461   const bool linux_flow_used = !linux_kernel_path().empty()
1462     || !linux_initramfs_path().empty()
1463     || !linux_root_image().empty();
1464 
1465   const bool fuchsia_flow_used = !fuchsia_zedboot_path().empty()
1466     || !fuchsia_root_image().empty()
1467     || !fuchsia_multiboot_bin_path().empty();
1468 
1469   if (android_efi_loader_flow_used) {
1470     return BootFlow::AndroidEfiLoader;
1471   } else if (chromeos_flow_used) {
1472     return BootFlow::ChromeOs;
1473   } else if (chromeos_disk_flow_used) {
1474     return BootFlow::ChromeOsDisk;
1475   } else if (linux_flow_used) {
1476     return BootFlow::Linux;
1477   } else if (fuchsia_flow_used) {
1478     return BootFlow::Fuchsia;
1479   } else {
1480     return BootFlow::Android;
1481   }
1482  }
1483 
mobile_bridge_name() const1484 std::string CuttlefishConfig::InstanceSpecific::mobile_bridge_name() const {
1485   return (*Dictionary())[kMobileBridgeName].asString();
1486 }
set_mobile_bridge_name(const std::string & mobile_bridge_name)1487 void CuttlefishConfig::MutableInstanceSpecific::set_mobile_bridge_name(
1488     const std::string& mobile_bridge_name) {
1489   (*Dictionary())[kMobileBridgeName] = mobile_bridge_name;
1490 }
1491 
1492 static constexpr char kMobileTapName[] = "mobile_tap_name";
mobile_tap_name() const1493 std::string CuttlefishConfig::InstanceSpecific::mobile_tap_name() const {
1494   return (*Dictionary())[kMobileTapName].asString();
1495 }
set_mobile_tap_name(const std::string & mobile_tap_name)1496 void CuttlefishConfig::MutableInstanceSpecific::set_mobile_tap_name(
1497     const std::string& mobile_tap_name) {
1498   (*Dictionary())[kMobileTapName] = mobile_tap_name;
1499 }
1500 
1501 static constexpr char kMobileMac[] = "mobile_mac";
mobile_mac() const1502 std::string CuttlefishConfig::InstanceSpecific::mobile_mac() const {
1503   return (*Dictionary())[kMobileMac].asString();
1504 }
set_mobile_mac(const std::string & mac)1505 void CuttlefishConfig::MutableInstanceSpecific::set_mobile_mac(
1506     const std::string& mac) {
1507   (*Dictionary())[kMobileMac] = mac;
1508 }
1509 
1510 // TODO(b/199103204): remove this as well when
1511 // PRODUCT_ENFORCE_MAC80211_HWSIM is removed
1512 static constexpr char kWifiTapName[] = "wifi_tap_name";
wifi_tap_name() const1513 std::string CuttlefishConfig::InstanceSpecific::wifi_tap_name() const {
1514   return (*Dictionary())[kWifiTapName].asString();
1515 }
set_wifi_tap_name(const std::string & wifi_tap_name)1516 void CuttlefishConfig::MutableInstanceSpecific::set_wifi_tap_name(
1517     const std::string& wifi_tap_name) {
1518   (*Dictionary())[kWifiTapName] = wifi_tap_name;
1519 }
1520 
1521 static constexpr char kWifiBridgeName[] = "wifi_bridge_name";
wifi_bridge_name() const1522 std::string CuttlefishConfig::InstanceSpecific::wifi_bridge_name() const {
1523   return (*Dictionary())[kWifiBridgeName].asString();
1524 }
set_wifi_bridge_name(const std::string & wifi_bridge_name)1525 void CuttlefishConfig::MutableInstanceSpecific::set_wifi_bridge_name(
1526     const std::string& wifi_bridge_name) {
1527   (*Dictionary())[kWifiBridgeName] = wifi_bridge_name;
1528 }
1529 
1530 static constexpr char kWifiMac[] = "wifi_mac";
wifi_mac() const1531 std::string CuttlefishConfig::InstanceSpecific::wifi_mac() const {
1532   return (*Dictionary())[kWifiMac].asString();
1533 }
set_wifi_mac(const std::string & mac)1534 void CuttlefishConfig::MutableInstanceSpecific::set_wifi_mac(
1535     const std::string& mac) {
1536   (*Dictionary())[kWifiMac] = mac;
1537 }
1538 
1539 static constexpr char kUseBridgedWifiTap[] = "use_bridged_wifi_tap";
use_bridged_wifi_tap() const1540 bool CuttlefishConfig::InstanceSpecific::use_bridged_wifi_tap() const {
1541   return (*Dictionary())[kUseBridgedWifiTap].asBool();
1542 }
set_use_bridged_wifi_tap(bool use_bridged_wifi_tap)1543 void CuttlefishConfig::MutableInstanceSpecific::set_use_bridged_wifi_tap(
1544     bool use_bridged_wifi_tap) {
1545   (*Dictionary())[kUseBridgedWifiTap] = use_bridged_wifi_tap;
1546 }
1547 
1548 static constexpr char kEthernetTapName[] = "ethernet_tap_name";
ethernet_tap_name() const1549 std::string CuttlefishConfig::InstanceSpecific::ethernet_tap_name() const {
1550   return (*Dictionary())[kEthernetTapName].asString();
1551 }
set_ethernet_tap_name(const std::string & ethernet_tap_name)1552 void CuttlefishConfig::MutableInstanceSpecific::set_ethernet_tap_name(
1553     const std::string& ethernet_tap_name) {
1554   (*Dictionary())[kEthernetTapName] = ethernet_tap_name;
1555 }
1556 
1557 static constexpr char kEthernetBridgeName[] = "ethernet_bridge_name";
ethernet_bridge_name() const1558 std::string CuttlefishConfig::InstanceSpecific::ethernet_bridge_name() const {
1559   return (*Dictionary())[kEthernetBridgeName].asString();
1560 }
set_ethernet_bridge_name(const std::string & ethernet_bridge_name)1561 void CuttlefishConfig::MutableInstanceSpecific::set_ethernet_bridge_name(
1562     const std::string& ethernet_bridge_name) {
1563   (*Dictionary())[kEthernetBridgeName] = ethernet_bridge_name;
1564 }
1565 
1566 static constexpr char kEthernetMac[] = "ethernet_mac";
ethernet_mac() const1567 std::string CuttlefishConfig::InstanceSpecific::ethernet_mac() const {
1568   return (*Dictionary())[kEthernetMac].asString();
1569 }
set_ethernet_mac(const std::string & mac)1570 void CuttlefishConfig::MutableInstanceSpecific::set_ethernet_mac(
1571     const std::string& mac) {
1572   (*Dictionary())[kEthernetMac] = mac;
1573 }
1574 
1575 static constexpr char kEthernetIPV6[] = "ethernet_ipv6";
ethernet_ipv6() const1576 std::string CuttlefishConfig::InstanceSpecific::ethernet_ipv6() const {
1577   return (*Dictionary())[kEthernetIPV6].asString();
1578 }
set_ethernet_ipv6(const std::string & ip)1579 void CuttlefishConfig::MutableInstanceSpecific::set_ethernet_ipv6(
1580     const std::string& ip) {
1581   (*Dictionary())[kEthernetIPV6] = ip;
1582 }
1583 
1584 static constexpr char kUseAllocd[] = "use_allocd";
use_allocd() const1585 bool CuttlefishConfig::InstanceSpecific::use_allocd() const {
1586   return (*Dictionary())[kUseAllocd].asBool();
1587 }
set_use_allocd(bool use_allocd)1588 void CuttlefishConfig::MutableInstanceSpecific::set_use_allocd(
1589     bool use_allocd) {
1590   (*Dictionary())[kUseAllocd] = use_allocd;
1591 }
1592 
1593 static constexpr char kSessionId[] = "session_id";
session_id() const1594 uint32_t CuttlefishConfig::InstanceSpecific::session_id() const {
1595   return (*Dictionary())[kSessionId].asUInt();
1596 }
set_session_id(uint32_t session_id)1597 void CuttlefishConfig::MutableInstanceSpecific::set_session_id(
1598     uint32_t session_id) {
1599   (*Dictionary())[kSessionId] = session_id;
1600 }
1601 
1602 static constexpr char kVsockGuestCid[] = "vsock_guest_cid";
vsock_guest_cid() const1603 int CuttlefishConfig::InstanceSpecific::vsock_guest_cid() const {
1604   return (*Dictionary())[kVsockGuestCid].asInt();
1605 }
set_vsock_guest_cid(int vsock_guest_cid)1606 void CuttlefishConfig::MutableInstanceSpecific::set_vsock_guest_cid(
1607     int vsock_guest_cid) {
1608   (*Dictionary())[kVsockGuestCid] = vsock_guest_cid;
1609 }
1610 
1611 static constexpr char kVsockGuestGroup[] = "vsock_guest_group";
vsock_guest_group() const1612 std::string CuttlefishConfig::InstanceSpecific::vsock_guest_group() const {
1613   return (*Dictionary())[kVsockGuestGroup].asString();
1614 }
set_vsock_guest_group(const std::string & vsock_guest_group)1615 void CuttlefishConfig::MutableInstanceSpecific::set_vsock_guest_group(
1616     const std::string& vsock_guest_group) {
1617   (*Dictionary())[kVsockGuestGroup] = vsock_guest_group;
1618 }
1619 
1620 static constexpr char kUuid[] = "uuid";
uuid() const1621 std::string CuttlefishConfig::InstanceSpecific::uuid() const {
1622   return (*Dictionary())[kUuid].asString();
1623 }
set_uuid(const std::string & uuid)1624 void CuttlefishConfig::MutableInstanceSpecific::set_uuid(const std::string& uuid) {
1625   (*Dictionary())[kUuid] = uuid;
1626 }
1627 
1628 static constexpr char kEnvironmentName[] = "environment_name";
environment_name() const1629 std::string CuttlefishConfig::InstanceSpecific::environment_name() const {
1630   return (*Dictionary())[kEnvironmentName].asString();
1631 }
set_environment_name(const std::string & environment_name)1632 void CuttlefishConfig::MutableInstanceSpecific::set_environment_name(
1633     const std::string& environment_name) {
1634   (*Dictionary())[kEnvironmentName] = environment_name;
1635 }
1636 
CrosvmSocketPath() const1637 std::string CuttlefishConfig::InstanceSpecific::CrosvmSocketPath() const {
1638   return PerInstanceInternalUdsPath("crosvm_control.sock");
1639 }
1640 
OpenwrtCrosvmSocketPath() const1641 std::string CuttlefishConfig::InstanceSpecific::OpenwrtCrosvmSocketPath()
1642     const {
1643   return PerInstanceInternalUdsPath("ap_control.sock");
1644 }
1645 
1646 static constexpr char kHostPort[] = "adb_host_port";
adb_host_port() const1647 int CuttlefishConfig::InstanceSpecific::adb_host_port() const {
1648   return (*Dictionary())[kHostPort].asInt();
1649 }
set_adb_host_port(int port)1650 void CuttlefishConfig::MutableInstanceSpecific::set_adb_host_port(int port) {
1651   (*Dictionary())[kHostPort] = port;
1652 }
1653 
1654 static constexpr char kFastbootHostPort[] = "fastboot_host_port";
fastboot_host_port() const1655 int CuttlefishConfig::InstanceSpecific::fastboot_host_port() const {
1656   return (*Dictionary())[kFastbootHostPort].asInt();
1657 }
set_fastboot_host_port(int port)1658 void CuttlefishConfig::MutableInstanceSpecific::set_fastboot_host_port(int port) {
1659   (*Dictionary())[kFastbootHostPort] = port;
1660 }
1661 
1662 static constexpr char kModemSimulatorId[] = "modem_simulator_host_id";
modem_simulator_host_id() const1663 int CuttlefishConfig::InstanceSpecific::modem_simulator_host_id() const {
1664   return (*Dictionary())[kModemSimulatorId].asInt();
1665 }
set_modem_simulator_host_id(int id)1666 void CuttlefishConfig::MutableInstanceSpecific::set_modem_simulator_host_id(
1667     int id) {
1668   (*Dictionary())[kModemSimulatorId] = id;
1669 }
1670 
1671 static constexpr char kAdbIPAndPort[] = "adb_ip_and_port";
adb_ip_and_port() const1672 std::string CuttlefishConfig::InstanceSpecific::adb_ip_and_port() const {
1673   return (*Dictionary())[kAdbIPAndPort].asString();
1674 }
set_adb_ip_and_port(const std::string & ip_port)1675 void CuttlefishConfig::MutableInstanceSpecific::set_adb_ip_and_port(
1676     const std::string& ip_port) {
1677   (*Dictionary())[kAdbIPAndPort] = ip_port;
1678 }
1679 
adb_device_name() const1680 std::string CuttlefishConfig::InstanceSpecific::adb_device_name() const {
1681   if (adb_ip_and_port() != "") {
1682     return adb_ip_and_port();
1683   }
1684   LOG(ERROR) << "no adb_mode found, returning bad device name";
1685   return "NO_ADB_MODE_SET_NO_VALID_DEVICE_NAME";
1686 }
1687 
1688 static constexpr char kQemuVncServerPort[] = "qemu_vnc_server_port";
qemu_vnc_server_port() const1689 int CuttlefishConfig::InstanceSpecific::qemu_vnc_server_port() const {
1690   return (*Dictionary())[kQemuVncServerPort].asInt();
1691 }
set_qemu_vnc_server_port(int qemu_vnc_server_port)1692 void CuttlefishConfig::MutableInstanceSpecific::set_qemu_vnc_server_port(
1693     int qemu_vnc_server_port) {
1694   (*Dictionary())[kQemuVncServerPort] = qemu_vnc_server_port;
1695 }
1696 
1697 static constexpr char kTombstoneReceiverPort[] = "tombstone_receiver_port";
tombstone_receiver_port() const1698 int CuttlefishConfig::InstanceSpecific::tombstone_receiver_port() const {
1699   return (*Dictionary())[kTombstoneReceiverPort].asInt();
1700 }
set_tombstone_receiver_port(int tombstone_receiver_port)1701 void CuttlefishConfig::MutableInstanceSpecific::set_tombstone_receiver_port(int tombstone_receiver_port) {
1702   (*Dictionary())[kTombstoneReceiverPort] = tombstone_receiver_port;
1703 }
1704 
1705 static constexpr char kAudioControlServerPort[] = "audiocontrol_server_port";
audiocontrol_server_port() const1706 int CuttlefishConfig::InstanceSpecific::audiocontrol_server_port() const {
1707   return (*Dictionary())[kAudioControlServerPort].asInt();
1708 }
set_audiocontrol_server_port(int audiocontrol_server_port)1709 void CuttlefishConfig::MutableInstanceSpecific::set_audiocontrol_server_port(int audiocontrol_server_port) {
1710   (*Dictionary())[kAudioControlServerPort] = audiocontrol_server_port;
1711 }
1712 
1713 static constexpr char kConfigServerPort[] = "config_server_port";
config_server_port() const1714 int CuttlefishConfig::InstanceSpecific::config_server_port() const {
1715   return (*Dictionary())[kConfigServerPort].asInt();
1716 }
set_config_server_port(int config_server_port)1717 void CuttlefishConfig::MutableInstanceSpecific::set_config_server_port(int config_server_port) {
1718   (*Dictionary())[kConfigServerPort] = config_server_port;
1719 }
1720 
1721 static constexpr char kLightsServerPort[] = "lights_server_port";
lights_server_port() const1722 int CuttlefishConfig::InstanceSpecific::lights_server_port() const {
1723   return (*Dictionary())[kLightsServerPort].asInt();
1724 }
set_lights_server_port(int lights_server_port)1725 void CuttlefishConfig::MutableInstanceSpecific::set_lights_server_port(int lights_server_port) {
1726   (*Dictionary())[kLightsServerPort] = lights_server_port;
1727 }
1728 
1729 static constexpr char kCameraServerPort[] = "camera_server_port";
camera_server_port() const1730 int CuttlefishConfig::InstanceSpecific::camera_server_port() const {
1731   return (*Dictionary())[kCameraServerPort].asInt();
1732 }
set_camera_server_port(int camera_server_port)1733 void CuttlefishConfig::MutableInstanceSpecific::set_camera_server_port(
1734     int camera_server_port) {
1735   (*Dictionary())[kCameraServerPort] = camera_server_port;
1736 }
1737 
1738 static constexpr char kWebrtcDeviceId[] = "webrtc_device_id";
set_webrtc_device_id(const std::string & id)1739 void CuttlefishConfig::MutableInstanceSpecific::set_webrtc_device_id(
1740     const std::string& id) {
1741   (*Dictionary())[kWebrtcDeviceId] = id;
1742 }
webrtc_device_id() const1743 std::string CuttlefishConfig::InstanceSpecific::webrtc_device_id() const {
1744   return (*Dictionary())[kWebrtcDeviceId].asString();
1745 }
1746 
1747 static constexpr char kGroupId[] = "group_id";
set_group_id(const std::string & id)1748 void CuttlefishConfig::MutableInstanceSpecific::set_group_id(
1749     const std::string& id) {
1750   (*Dictionary())[kGroupId] = id;
1751 }
group_id() const1752 std::string CuttlefishConfig::InstanceSpecific::group_id() const {
1753   return (*Dictionary())[kGroupId].asString();
1754 }
1755 
1756 static constexpr char kStartSigServer[] = "webrtc_start_sig_server";
set_start_webrtc_signaling_server(bool start)1757 void CuttlefishConfig::MutableInstanceSpecific::set_start_webrtc_signaling_server(bool start) {
1758   (*Dictionary())[kStartSigServer] = start;
1759 }
start_webrtc_sig_server() const1760 bool CuttlefishConfig::InstanceSpecific::start_webrtc_sig_server() const {
1761   return (*Dictionary())[kStartSigServer].asBool();
1762 }
1763 
1764 static constexpr char kStartSigServerProxy[] = "webrtc_start_sig_server_proxy";
1765 void CuttlefishConfig::MutableInstanceSpecific::
set_start_webrtc_sig_server_proxy(bool start)1766     set_start_webrtc_sig_server_proxy(bool start) {
1767   (*Dictionary())[kStartSigServerProxy] = start;
1768 }
start_webrtc_sig_server_proxy() const1769 bool CuttlefishConfig::InstanceSpecific::start_webrtc_sig_server_proxy() const {
1770   return (*Dictionary())[kStartSigServerProxy].asBool();
1771 }
1772 
1773 static constexpr char kStartRootcanal[] = "start_rootcanal";
set_start_rootcanal(bool start)1774 void CuttlefishConfig::MutableInstanceSpecific::set_start_rootcanal(
1775     bool start) {
1776   (*Dictionary())[kStartRootcanal] = start;
1777 }
start_rootcanal() const1778 bool CuttlefishConfig::InstanceSpecific::start_rootcanal() const {
1779   return (*Dictionary())[kStartRootcanal].asBool();
1780 }
1781 
1782 static constexpr char kStartCasimir[] = "start_casimir";
set_start_casimir(bool start)1783 void CuttlefishConfig::MutableInstanceSpecific::set_start_casimir(bool start) {
1784   (*Dictionary())[kStartCasimir] = start;
1785 }
start_casimir() const1786 bool CuttlefishConfig::InstanceSpecific::start_casimir() const {
1787   return (*Dictionary())[kStartCasimir].asBool();
1788 }
1789 
1790 static constexpr char kStartPica[] = "start_pica";
set_start_pica(bool start)1791 void CuttlefishConfig::MutableInstanceSpecific::set_start_pica(
1792     bool start) {
1793   (*Dictionary())[kStartPica] = start;
1794 }
start_pica() const1795 bool CuttlefishConfig::InstanceSpecific::start_pica() const {
1796   return (*Dictionary())[kStartPica].asBool();
1797 }
1798 
1799 static constexpr char kStartNetsim[] = "start_netsim";
set_start_netsim(bool start)1800 void CuttlefishConfig::MutableInstanceSpecific::set_start_netsim(bool start) {
1801   (*Dictionary())[kStartNetsim] = start;
1802 }
start_netsim() const1803 bool CuttlefishConfig::InstanceSpecific::start_netsim() const {
1804   return (*Dictionary())[kStartNetsim].asBool();
1805 }
1806 
1807 // TODO(b/288987294) Remove this when separating environment is done
1808 static constexpr char kStartWmediumdInstance[] = "start_wmediumd_instance";
set_start_wmediumd_instance(bool start)1809 void CuttlefishConfig::MutableInstanceSpecific::set_start_wmediumd_instance(
1810     bool start) {
1811   (*Dictionary())[kStartWmediumdInstance] = start;
1812 }
start_wmediumd_instance() const1813 bool CuttlefishConfig::InstanceSpecific::start_wmediumd_instance() const {
1814   return (*Dictionary())[kStartWmediumdInstance].asBool();
1815 }
1816 
1817 static constexpr char kMcu[] = "mcu";
set_mcu(const Json::Value & cfg)1818 void CuttlefishConfig::MutableInstanceSpecific::set_mcu(const Json::Value& cfg) {
1819   (*Dictionary())[kMcu] = cfg;
1820 }
mcu() const1821 const Json::Value& CuttlefishConfig::InstanceSpecific::mcu() const {
1822   return (*Dictionary())[kMcu];
1823 }
1824 
1825 static constexpr char kApBootFlow[] = "ap_boot_flow";
set_ap_boot_flow(APBootFlow flow)1826 void CuttlefishConfig::MutableInstanceSpecific::set_ap_boot_flow(APBootFlow flow) {
1827   (*Dictionary())[kApBootFlow] = static_cast<int>(flow);
1828 }
ap_boot_flow() const1829 APBootFlow CuttlefishConfig::InstanceSpecific::ap_boot_flow() const {
1830   return static_cast<APBootFlow>((*Dictionary())[kApBootFlow].asInt());
1831 }
1832 
1833 static constexpr char kCrosvmUseBalloon[] = "crosvm_use_balloon";
set_crosvm_use_balloon(const bool use_balloon)1834 void CuttlefishConfig::MutableInstanceSpecific::set_crosvm_use_balloon(
1835     const bool use_balloon) {
1836   (*Dictionary())[kCrosvmUseBalloon] = use_balloon;
1837 }
crosvm_use_balloon() const1838 bool CuttlefishConfig::InstanceSpecific::crosvm_use_balloon() const {
1839   return (*Dictionary())[kCrosvmUseBalloon].asBool();
1840 }
1841 
1842 static constexpr char kCrosvmUseRng[] = "crosvm_use_rng";
set_crosvm_use_rng(const bool use_rng)1843 void CuttlefishConfig::MutableInstanceSpecific::set_crosvm_use_rng(
1844     const bool use_rng) {
1845   (*Dictionary())[kCrosvmUseRng] = use_rng;
1846 }
crosvm_use_rng() const1847 bool CuttlefishConfig::InstanceSpecific::crosvm_use_rng() const {
1848   return (*Dictionary())[kCrosvmUseRng].asBool();
1849 }
1850 
1851 static constexpr char kCrosvmUsePmem[] = "use_pmem";
set_use_pmem(const bool use_pmem)1852 void CuttlefishConfig::MutableInstanceSpecific::set_use_pmem(
1853     const bool use_pmem) {
1854   (*Dictionary())[kCrosvmUsePmem] = use_pmem;
1855 }
use_pmem() const1856 bool CuttlefishConfig::InstanceSpecific::use_pmem() const {
1857   return (*Dictionary())[kCrosvmUsePmem].asBool();
1858 }
1859 
touch_socket_path(int touch_dev_idx) const1860 std::string CuttlefishConfig::InstanceSpecific::touch_socket_path(
1861     int touch_dev_idx) const {
1862   return PerInstanceInternalUdsPath(
1863       ("touch_" + std::to_string(touch_dev_idx) + ".sock").c_str());
1864 }
1865 
mouse_socket_path() const1866 std::string CuttlefishConfig::InstanceSpecific::mouse_socket_path() const {
1867   return PerInstanceInternalPath("mouse.sock");
1868 }
1869 
rotary_socket_path() const1870 std::string CuttlefishConfig::InstanceSpecific::rotary_socket_path() const {
1871   return PerInstanceInternalPath("rotary.sock");
1872 }
1873 
keyboard_socket_path() const1874 std::string CuttlefishConfig::InstanceSpecific::keyboard_socket_path() const {
1875   return PerInstanceInternalUdsPath("keyboard.sock");
1876 }
1877 
switches_socket_path() const1878 std::string CuttlefishConfig::InstanceSpecific::switches_socket_path() const {
1879   return PerInstanceInternalUdsPath("switches.sock");
1880 }
1881 
1882 static constexpr char kFrameSockPath[] = "frame_sock_path";
set_frames_socket_path(const std::string & frame_socket_path)1883 void CuttlefishConfig::MutableInstanceSpecific::set_frames_socket_path(
1884     const std::string& frame_socket_path) {
1885   (*Dictionary())[kFrameSockPath] = frame_socket_path;
1886 }
1887 
frames_socket_path() const1888 std::string CuttlefishConfig::InstanceSpecific::frames_socket_path() const {
1889   return (*Dictionary())[kFrameSockPath].asString();
1890 }
1891 
1892 static constexpr char kWifiMacPrefix[] = "wifi_mac_prefix";
wifi_mac_prefix() const1893 int CuttlefishConfig::InstanceSpecific::wifi_mac_prefix() const {
1894   return (*Dictionary())[kWifiMacPrefix].asInt();
1895 }
set_wifi_mac_prefix(int wifi_mac_prefix)1896 void CuttlefishConfig::MutableInstanceSpecific::set_wifi_mac_prefix(
1897     int wifi_mac_prefix) {
1898   (*Dictionary())[kWifiMacPrefix] = wifi_mac_prefix;
1899 }
1900 
1901 static constexpr char kStartVhalProxyServer[] = "start_vhal_proxy_server";
set_start_vhal_proxy_server(bool start_vhal_proxy_server)1902 void CuttlefishConfig::MutableInstanceSpecific::set_start_vhal_proxy_server(
1903     bool start_vhal_proxy_server) {
1904   (*Dictionary())[kStartVhalProxyServer] = start_vhal_proxy_server;
1905 }
start_vhal_proxy_server() const1906 bool CuttlefishConfig::InstanceSpecific::start_vhal_proxy_server() const {
1907   return (*Dictionary())[kStartVhalProxyServer].asBool();
1908 }
1909 
factory_reset_protected_path() const1910 std::string CuttlefishConfig::InstanceSpecific::factory_reset_protected_path() const {
1911   return PerInstanceInternalPath("factory_reset_protected.img");
1912 }
1913 
persistent_bootconfig_path() const1914 std::string CuttlefishConfig::InstanceSpecific::persistent_bootconfig_path()
1915     const {
1916   return PerInstanceInternalPath("bootconfig");
1917 }
1918 
PerInstancePath(const std::string & file_name) const1919 std::string CuttlefishConfig::InstanceSpecific::PerInstancePath(
1920     const std::string& file_name) const {
1921   return (instance_dir() + "/") + file_name;
1922 }
1923 
PerInstanceInternalPath(const std::string & file_name) const1924 std::string CuttlefishConfig::InstanceSpecific::PerInstanceInternalPath(
1925     const std::string& file_name) const {
1926   if (file_name[0] == '\0') {
1927     // Don't append a / if file_name is empty.
1928     return PerInstancePath(kInternalDirName);
1929   }
1930   auto relative_path = (std::string(kInternalDirName) + "/") + file_name;
1931   return PerInstancePath(relative_path.c_str());
1932 }
1933 
PerInstanceUdsPath(const std::string & file_name) const1934 std::string CuttlefishConfig::InstanceSpecific::PerInstanceUdsPath(
1935     const std::string& file_name) const {
1936   return (instance_uds_dir() + "/") + file_name;
1937 }
1938 
PerInstanceInternalUdsPath(const std::string & file_name) const1939 std::string CuttlefishConfig::InstanceSpecific::PerInstanceInternalUdsPath(
1940     const std::string& file_name) const {
1941   if (file_name[0] == '\0') {
1942     // Don't append a / if file_name is empty.
1943     return PerInstanceUdsPath(kInternalDirName);
1944   }
1945   auto relative_path = (std::string(kInternalDirName) + "/") + file_name;
1946   return PerInstanceUdsPath(relative_path.c_str());
1947 }
1948 
PerInstanceGrpcSocketPath(const std::string & socket_name) const1949 std::string CuttlefishConfig::InstanceSpecific::PerInstanceGrpcSocketPath(
1950     const std::string& socket_name) const {
1951   if (socket_name.size() == 0) {
1952     // Don't append a / if file_name is empty.
1953     return PerInstanceUdsPath(kGrpcSocketDirName);
1954   }
1955   auto relative_path = (std::string(kGrpcSocketDirName) + "/") + socket_name;
1956   return PerInstanceUdsPath(relative_path.c_str());
1957 }
1958 
PerInstanceLogPath(const std::string & file_name) const1959 std::string CuttlefishConfig::InstanceSpecific::PerInstanceLogPath(
1960     const std::string& file_name) const {
1961   if (file_name.size() == 0) {
1962     // Don't append a / if file_name is empty.
1963     return PerInstancePath(kLogDirName);
1964   }
1965   auto relative_path = (std::string(kLogDirName) + "/") + file_name;
1966   return PerInstancePath(relative_path.c_str());
1967 }
1968 
instance_name() const1969 std::string CuttlefishConfig::InstanceSpecific::instance_name() const {
1970   return IdToName(id_);
1971 }
1972 
id() const1973 std::string CuttlefishConfig::InstanceSpecific::id() const { return id_; }
1974 
1975 }  // namespace cuttlefish
1976