OLD | NEW |
(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 |
OLD | NEW |