blob: 8b3780ffa475606209ac9f0b3a5194cb7c53910c [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 "src/developer/forensics/feedback_data/attachments/screenshot_ptr.h"
#include <lib/async/cpp/task.h>
#include <lib/syslog/cpp/macros.h>
#include "src/developer/forensics/utils/errors.h"
#include "src/developer/forensics/utils/fit/promise.h"
namespace forensics {
namespace feedback_data {
namespace {
using fuchsia::ui::scenic::ScreenshotData;
} // namespace
::fit::promise<ScreenshotData> TakeScreenshot(async_dispatcher_t* dispatcher,
std::shared_ptr<sys::ServiceDirectory> services,
fit::Timeout timeout) {
std::unique_ptr<Scenic> scenic = std::make_unique<Scenic>(dispatcher, services);
// We must store the promise in a variable due to the fact that the order of evaluation of
// function parameters is undefined.
auto screenshot = scenic->TakeScreenshot(std::move(timeout));
return fit::ExtendArgsLifetimeBeyondPromise(/*promise=*/std::move(screenshot),
/*args=*/std::move(scenic));
}
Scenic::Scenic(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services)
: scenic_(dispatcher, services) {}
::fit::promise<ScreenshotData> Scenic::TakeScreenshot(fit::Timeout timeout) {
scenic_->TakeScreenshot([this](ScreenshotData raw_screenshot, bool success) {
if (scenic_.IsAlreadyDone()) {
return;
}
if (!success) {
FX_LOGS(WARNING) << "Scenic failed to take screenshot";
scenic_.CompleteError(Error::kDefault);
} else {
scenic_.CompleteOk(std::move(raw_screenshot));
}
});
return scenic_.WaitForDone(std::move(timeout)).or_else([](const Error& error) {
return ::fit::error();
});
}
} // namespace feedback_data
} // namespace forensics