1#include "include/private/dvr/display_manager_client.h"
2
3#include <pdx/default_transport/client_channel_factory.h>
4#include <private/dvr/buffer_hub_client.h>
5#include <private/dvr/buffer_hub_queue_client.h>
6#include <private/dvr/display_protocol.h>
7#include <utils/Log.h>
8
9using android::pdx::ErrorStatus;
10using android::pdx::LocalChannelHandle;
11using android::pdx::Transaction;
12
13namespace android {
14namespace dvr {
15namespace display {
16
17DisplayManagerClient::DisplayManagerClient()
18    : BASE(pdx::default_transport::ClientChannelFactory::Create(
19          DisplayManagerProtocol::kClientPath)) {}
20
21DisplayManagerClient::~DisplayManagerClient() {}
22
23pdx::Status<std::vector<display::SurfaceState>>
24DisplayManagerClient::GetSurfaceState() {
25  auto status = InvokeRemoteMethod<DisplayManagerProtocol::GetSurfaceState>();
26  if (!status) {
27    ALOGE(
28        "DisplayManagerClient::GetSurfaceState: Failed to get surface info: %s",
29        status.GetErrorMessage().c_str());
30  }
31
32  return status;
33}
34
35pdx::Status<std::unique_ptr<IonBuffer>> DisplayManagerClient::SetupNamedBuffer(
36    const std::string& name, size_t size, uint64_t usage) {
37  auto status = InvokeRemoteMethod<DisplayManagerProtocol::SetupNamedBuffer>(
38      name, size, usage);
39  if (!status) {
40    ALOGE(
41        "DisplayManagerClient::SetupPoseBuffer: Failed to create the named "
42        "buffer %s",
43        status.GetErrorMessage().c_str());
44    return status.error_status();
45  }
46
47  auto ion_buffer = std::make_unique<IonBuffer>();
48  auto native_buffer_handle = status.take();
49  const int ret = native_buffer_handle.Import(ion_buffer.get());
50  if (ret < 0) {
51    ALOGE(
52        "DisplayClient::GetNamedBuffer: Failed to import named buffer: "
53        "name=%s; error=%s",
54        name.c_str(), strerror(-ret));
55    return ErrorStatus(-ret);
56  }
57
58  return {std::move(ion_buffer)};
59}
60
61pdx::Status<std::unique_ptr<ConsumerQueue>>
62DisplayManagerClient::GetSurfaceQueue(int surface_id, int queue_id) {
63  auto status = InvokeRemoteMethod<DisplayManagerProtocol::GetSurfaceQueue>(
64      surface_id, queue_id);
65  if (!status) {
66    ALOGE(
67        "DisplayManagerClient::GetSurfaceQueue: Failed to get queue for "
68        "surface_id=%d queue_id=%d: %s",
69        surface_id, queue_id, status.GetErrorMessage().c_str());
70    return status.error_status();
71  }
72
73  return {ConsumerQueue::Import(status.take())};
74}
75
76}  // namespace display
77}  // namespace dvr
78}  // namespace android
79