Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Side by Side Diff: chromeos/dbus/services/surface_service_provider.cc

Issue 1394573003: chromeos: Add SurfaceServiceProvider. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chromeos/dbus/services/surface_service_provider.h"
6
7 #include "base/bind.h"
8 #include "dbus/message.h"
9 #include "third_party/cros_system_api/dbus/service_constants.h"
10
11 namespace chromeos {
12 namespace {
13
14 // TODO(reveman): Move all these constants to third_party/cros_system_api.
15 const char kCreatePrimeBuffer[] = "CreatePrimeBuffer";
16 const char kDestroyBuffer[] = "DestroyBuffer";
17 const char kReleaseBuffer[] = "ReleaseBuffer";
18 const char kAttachBufferToTestShellSurface[] = "AttachBufferToTestShellSurface";
19
20 void OnBufferCreated(
21 const dbus::ExportedObject::ResponseSender& response_sender,
22 scoped_ptr<dbus::Response> response,
23 bool success) {
24 // TODO(reveman): Send error response if success is false.
25 response_sender.Run(response.Pass());
26 }
27
28 } // namespace
29
30 SurfaceServiceProvider::SurfaceServiceProvider(scoped_ptr<Delegate> delegate)
31 : delegate_(delegate.Pass()), weak_ptr_factory_(this) {}
32
33 SurfaceServiceProvider::~SurfaceServiceProvider() {}
34
35 void SurfaceServiceProvider::Start(
36 scoped_refptr<dbus::ExportedObject> exported_object) {
37 exported_object_ = exported_object;
38 exported_object_->ExportMethod(
39 kLibCrosServiceInterface, kCreatePrimeBuffer,
40 base::Bind(&SurfaceServiceProvider::CreatePrimeBuffer,
41 weak_ptr_factory_.GetWeakPtr()),
42 base::Bind(&SurfaceServiceProvider::OnExported,
43 weak_ptr_factory_.GetWeakPtr()));
44
45 exported_object_->ExportMethod(
46 kLibCrosServiceInterface, kDestroyBuffer,
47 base::Bind(&SurfaceServiceProvider::DestroyBuffer,
48 weak_ptr_factory_.GetWeakPtr()),
49 base::Bind(&SurfaceServiceProvider::OnExported,
50 weak_ptr_factory_.GetWeakPtr()));
51
52 exported_object_->ExportMethod(
53 kLibCrosServiceInterface, kAttachBufferToTestShellSurface,
54 base::Bind(&SurfaceServiceProvider::AttachBufferToTestShellSurface,
55 weak_ptr_factory_.GetWeakPtr()),
56 base::Bind(&SurfaceServiceProvider::OnExported,
57 weak_ptr_factory_.GetWeakPtr()));
58 }
59
60 void SurfaceServiceProvider::CreatePrimeBuffer(
61 dbus::MethodCall* method_call,
62 dbus::ExportedObject::ResponseSender response_sender) {
63 uint32 id = 0;
64 dbus::FileDescriptor name;
65 int32 width = 0;
66 int32 height = 0;
67 uint32 format = 0;
68 int32 stride = 0;
69 dbus::MessageReader reader(method_call);
70 if (!reader.PopUint32(&id) || !reader.PopFileDescriptor(&name) ||
71 !reader.PopInt32(&width) || !reader.PopInt32(&height) ||
72 !reader.PopUint32(&format) || !reader.PopInt32(&stride)) {
73 LOG(ERROR) << "Unable to parse " << kCreatePrimeBuffer << " request";
74 response_sender.Run(dbus::Response::FromMethodCall(method_call));
75 return;
76 }
77
78 name.CheckValidity();
79 if (!name.is_valid()) {
80 LOG(ERROR) << kCreatePrimeBuffer
81 << " request contained an invalid file descriptor";
82 response_sender.Run(dbus::Response::FromMethodCall(method_call));
83 return;
84 }
85
86 delegate_->CreatePrimeBuffer(
87 id, base::ScopedFD(name.TakeValue()), width, height, format, stride,
88 base::Bind(&OnBufferCreated, response_sender,
89 base::Passed(dbus::Response::FromMethodCall(method_call))));
90 }
91
92 void SurfaceServiceProvider::DestroyBuffer(
93 dbus::MethodCall* method_call,
94 dbus::ExportedObject::ResponseSender response_sender) {
95 uint32 id = 0;
96 dbus::MessageReader reader(method_call);
97 if (reader.PopUint32(&id)) {
98 delegate_->DestroyBuffer(id);
99 } else {
100 LOG(ERROR) << "Unable to parse " << kDestroyBuffer << " request";
101 }
102 response_sender.Run(dbus::Response::FromMethodCall(method_call));
103 }
104
105 void SurfaceServiceProvider::AttachBufferToTestShellSurface(
106 dbus::MethodCall* method_call,
107 dbus::ExportedObject::ResponseSender response_sender) {
108 uint32 buffer_id = 0;
109 dbus::MessageReader reader(method_call);
110 if (reader.PopUint32(&buffer_id)) {
111 delegate_->AttachBufferToTestShellSurface(
112 buffer_id, base::Bind(&SurfaceServiceProvider::ReleaseBuffer,
113 weak_ptr_factory_.GetWeakPtr(), buffer_id));
114 } else {
115 LOG(ERROR) << "Unable to parse " << kAttachBufferToTestShellSurface
116 << " request";
117 }
118 response_sender.Run(dbus::Response::FromMethodCall(method_call));
119 }
120
121 void SurfaceServiceProvider::ReleaseBuffer(uint32 id) {
122 dbus::Signal signal(kLibCrosServiceInterface, kReleaseBuffer);
123 dbus::MessageWriter writer(&signal);
124 writer.AppendUint32(id);
125 exported_object_->SendSignal(&signal);
126 }
127
128 void SurfaceServiceProvider::OnExported(const std::string& interface_name,
129 const std::string& method_name,
130 bool success) {
131 if (!success)
132 LOG(ERROR) << "failed to export " << interface_name << "." << method_name;
133 }
134
135 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698