blob: 4f69170c275bce3d6a4259c7f705a7f10ba6c9d8 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "dlcservice/error.h"
#include <base/strings/stringprintf.h>
#include <brillo/errors/error_codes.h>
#include <dbus/dlcservice/dbus-constants.h>
namespace dlcservice {
const char kDlcErrorDomain[] = "dlcservice";
namespace error {
const char kFailedToCreateDirectory[] = "failedToCreateDirectory";
const char kFailedInstallInUpdateEngine[] = "failedInstallInUpdateEngine";
const char kFailedInternal[] = "InternalError";
const char kFailedToVerifyImage[] = "failedToVerifyImage";
const char kFailedToMountImage[] = "failedToMountImage";
} // namespace error
// static
brillo::ErrorPtr Error::Create(const base::Location& location,
const std::string& code,
const std::string& msg) {
return brillo::Error::Create(location, brillo::errors::dbus::kDomain, code,
msg);
}
// static
brillo::ErrorPtr Error::CreateInternal(const base::Location& location,
const std::string& code,
const std::string& message) {
return brillo::Error::Create(location, kDlcErrorDomain, code, message);
}
// static
void Error::AddTo(brillo::ErrorPtr* error,
const base::Location& location,
const std::string& code,
const std::string& message) {
brillo::Error::AddTo(error, location, brillo::errors::dbus::kDomain, code,
message);
}
// static
void Error::AddInternalTo(brillo::ErrorPtr* error,
const base::Location& location,
const std::string& code,
const std::string& message) {
brillo::Error::AddTo(error, location, kDlcErrorDomain, code, message);
}
// static
std::string Error::ToString(const brillo::ErrorPtr& err) {
// TODO(crbug.com/999284): No inner error support, err->GetInnerError().
DCHECK(err);
return base::StringPrintf("Error Code=%s, Error Message=%s",
err->GetCode().c_str(), err->GetMessage().c_str());
}
std::string Error::GetRootErrorCode(const brillo::ErrorPtr& error) {
DCHECK(error);
return error->GetFirstError()->GetCode();
}
std::string Error::GetDbusErrorCode(const brillo::ErrorPtr& error) {
const brillo::Error* dbus_err = brillo::Error::FindErrorOfDomain(
error.get(), brillo::errors::dbus::kDomain);
if (dbus_err)
return dbus_err->GetCode();
else
return kErrorInternal;
}
void Error::ConvertToDbusError(brillo::ErrorPtr* error) {
DCHECK(error->get());
if (error->get()->GetInnerError() == nullptr &&
error->get()->GetDomain() == brillo::errors::dbus::kDomain)
return; // The error is already a dbus error without inner errors.
const brillo::Error* dbus_err = brillo::Error::FindErrorOfDomain(
error->get(), brillo::errors::dbus::kDomain);
if (dbus_err)
*error = Create(dbus_err->GetLocation(), dbus_err->GetCode(),
dbus_err->GetMessage());
else // We would only reach here if there are no dbus errors in the chain.
*error = Create(error->get()->GetLocation(), kErrorInternal,
error->get()->GetMessage());
}
} // namespace dlcservice