1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/borealis/borealis_app_launcher.h"
#include <algorithm>
#include "base/functional/bind.h"
#include "chrome/browser/ash/borealis/borealis_context.h"
#include "chrome/browser/ash/borealis/borealis_context_manager.h"
#include "chrome/browser/ash/borealis/borealis_features.h"
#include "chrome/browser/ash/borealis/borealis_service.h"
#include "chrome/browser/ash/borealis/borealis_util.h"
#include "chrome/browser/ash/guest_os/guest_os_registry_service.h"
#include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
#include "chromeos/ash/components/dbus/cicerone/cicerone_service.pb.h"
namespace borealis {
void BorealisAppLauncher::Launch(const BorealisContext& ctx,
const std::string& app_id,
OnLaunchedCallback callback) {
Launch(ctx, app_id, {}, std::move(callback));
}
void BorealisAppLauncher::Launch(const BorealisContext& ctx,
const std::string& app_id,
const std::vector<std::string>& args,
OnLaunchedCallback callback) {
// Launching the borealis app is a legacy way of launching its main app
if (app_id == kInstallerAppId) {
Launch(ctx, kClientAppId, args, std::move(callback));
return;
}
std::optional<guest_os::GuestOsRegistryService::Registration> reg =
guest_os::GuestOsRegistryServiceFactory::GetForProfile(ctx.profile())
->GetRegistration(app_id);
if (!reg) {
std::move(callback).Run(LaunchResult::kUnknownApp);
return;
}
vm_tools::cicerone::LaunchContainerApplicationRequest request;
request.set_owner_id(
ash::ProfileHelper::GetUserIdHashFromProfile(ctx.profile()));
request.set_vm_name(ctx.vm_name());
request.set_container_name(ctx.container_name());
request.set_desktop_file_id(reg->DesktopFileId());
std::ranges::copy(args, google::protobuf::RepeatedFieldBackInserter(
request.mutable_files()));
ash::CiceroneClient::Get()->LaunchContainerApplication(
std::move(request),
base::BindOnce(
[](OnLaunchedCallback callback,
std::optional<
vm_tools::cicerone::LaunchContainerApplicationResponse>
response) {
if (!response) {
LOG(ERROR) << "Failed to launch app: No response from cicerone";
std::move(callback).Run(LaunchResult::kNoResponse);
return;
}
if (!response->success()) {
LOG(ERROR) << "Failed to launch app: "
<< response->failure_reason();
std::move(callback).Run(LaunchResult::kError);
return;
}
std::move(callback).Run(LaunchResult::kSuccess);
},
std::move(callback)));
}
} // namespace borealis
|