| // Copyright 2019 The Chromium 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 "chromeos/dbus/arc_camera_client.h" |
| |
| #include <utility> |
| |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chromeos/dbus/fake_arc_camera_client.h" |
| #include "dbus/bus.h" |
| #include "dbus/message.h" |
| #include "dbus/object_proxy.h" |
| #include "third_party/cros_system_api/dbus/service_constants.h" |
| |
| namespace chromeos { |
| |
| namespace { |
| |
| ArcCameraClient* g_instance = nullptr; |
| |
| class ArcCameraClientImpl : public ArcCameraClient { |
| public: |
| explicit ArcCameraClientImpl(dbus::Bus* bus) |
| : proxy_(bus->GetObjectProxy( |
| arc_camera::kArcCameraServiceName, |
| dbus::ObjectPath(arc_camera::kArcCameraServicePath))), |
| weak_ptr_factory_(this) {} |
| |
| ~ArcCameraClientImpl() override = default; |
| |
| // ArcCameraClient overrides: |
| void StartService(int fd, |
| const std::string& token, |
| VoidDBusMethodCallback callback) override { |
| dbus::MethodCall method_call(arc_camera::kArcCameraServiceInterface, |
| "StartService"); |
| dbus::MessageWriter writer(&method_call); |
| writer.AppendFileDescriptor(fd); |
| writer.AppendString(token); |
| proxy_->CallMethod( |
| &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| base::BindOnce(&ArcCameraClientImpl::OnVoidMethod, |
| weak_ptr_factory_.GetWeakPtr(), std::move(callback))); |
| } |
| |
| private: |
| void OnVoidMethod(VoidDBusMethodCallback callback, dbus::Response* response) { |
| std::move(callback).Run(response); |
| } |
| |
| dbus::ObjectProxy* proxy_; |
| base::WeakPtrFactory<ArcCameraClientImpl> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ArcCameraClientImpl); |
| }; |
| |
| } // namespace |
| |
| ArcCameraClient::ArcCameraClient() { |
| DCHECK(!g_instance); |
| g_instance = this; |
| } |
| |
| ArcCameraClient::~ArcCameraClient() { |
| DCHECK_EQ(this, g_instance); |
| g_instance = nullptr; |
| } |
| |
| // static |
| void ArcCameraClient::Initialize(dbus::Bus* bus) { |
| DCHECK(bus); |
| new ArcCameraClientImpl(bus); |
| } |
| |
| // static |
| void ArcCameraClient::InitializeFake() { |
| // Do not create a new fake if it was initialized early in a browser test (to |
| // allow test properties to be set). |
| if (!FakeArcCameraClient::Get()) |
| new FakeArcCameraClient(); |
| } |
| |
| // static |
| void ArcCameraClient::Shutdown() { |
| DCHECK(g_instance); |
| delete g_instance; |
| } |
| |
| // static |
| ArcCameraClient* ArcCameraClient::Get() { |
| return g_instance; |
| } |
| |
| } // namespace chromeos |