diff options
author | pstew@chromium.org <pstew@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 05:11:41 +0000 |
---|---|---|
committer | pstew@chromium.org <pstew@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 05:11:41 +0000 |
commit | 1b8509aeeba108f226cbe4fdc00b98b7becd9648 (patch) | |
tree | 0379771556f44dace0d5ca2c9658149ed970b88e /chromeos/dbus | |
parent | 922bd4ab867a05ddb6f3a3a6f3d0e8fe14d1696a (diff) | |
download | chromium_src-1b8509aeeba108f226cbe4fdc00b98b7becd9648.zip chromium_src-1b8509aeeba108f226cbe4fdc00b98b7becd9648.tar.gz chromium_src-1b8509aeeba108f226cbe4fdc00b98b7becd9648.tar.bz2 |
Add Lorgnette Manager Client
Add a DBus client that can trigger document scanning.
BUG=358344
Review URL: https://codereview.chromium.org/234423005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264118 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos/dbus')
-rw-r--r-- | chromeos/dbus/dbus_thread_manager.cc | 11 | ||||
-rw-r--r-- | chromeos/dbus/dbus_thread_manager.h | 2 | ||||
-rw-r--r-- | chromeos/dbus/fake_dbus_thread_manager.cc | 12 | ||||
-rw-r--r-- | chromeos/dbus/fake_dbus_thread_manager.h | 3 | ||||
-rw-r--r-- | chromeos/dbus/fake_lorgnette_manager_client.cc | 40 | ||||
-rw-r--r-- | chromeos/dbus/fake_lorgnette_manager_client.h | 36 | ||||
-rw-r--r-- | chromeos/dbus/lorgnette_manager_client.cc | 201 | ||||
-rw-r--r-- | chromeos/dbus/lorgnette_manager_client.h | 68 |
8 files changed, 373 insertions, 0 deletions
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc index 46fd684..7056c03 100644 --- a/chromeos/dbus/dbus_thread_manager.cc +++ b/chromeos/dbus/dbus_thread_manager.cc @@ -30,6 +30,7 @@ #include "chromeos/dbus/gsm_sms_client.h" #include "chromeos/dbus/image_burner_client.h" #include "chromeos/dbus/introspectable_client.h" +#include "chromeos/dbus/lorgnette_manager_client.h" #include "chromeos/dbus/modem_messaging_client.h" #include "chromeos/dbus/nfc_adapter_client.h" #include "chromeos/dbus/nfc_device_client.h" @@ -88,6 +89,7 @@ class DBusClientBundle { cros_disks_client_.reset(CrosDisksClient::Create(client_type)); cryptohome_client_.reset(CryptohomeClient::Create()); debug_daemon_client_.reset(DebugDaemonClient::Create()); + lorgnette_manager_client_.reset(LorgnetteManagerClient::Create()); shill_manager_client_.reset(ShillManagerClient::Create()); shill_device_client_.reset(ShillDeviceClient::Create()); shill_ipconfig_client_.reset(ShillIPConfigClient::Create()); @@ -154,6 +156,9 @@ class DBusClientBundle { DebugDaemonClient* debug_daemon_client() { return debug_daemon_client_.get(); } + LorgnetteManagerClient* lorgnette_manager_client() { + return lorgnette_manager_client_.get(); + } ShillDeviceClient* shill_device_client() { return shill_device_client_.get(); } @@ -230,6 +235,7 @@ class DBusClientBundle { scoped_ptr<CrosDisksClient> cros_disks_client_; scoped_ptr<CryptohomeClient> cryptohome_client_; scoped_ptr<DebugDaemonClient> debug_daemon_client_; + scoped_ptr<LorgnetteManagerClient> lorgnette_manager_client_; scoped_ptr<ShillDeviceClient> shill_device_client_; scoped_ptr<ShillIPConfigClient> shill_ipconfig_client_; scoped_ptr<ShillManagerClient> shill_manager_client_; @@ -365,6 +371,10 @@ class DBusThreadManagerImpl : public DBusThreadManager { return client_bundle_->debug_daemon_client(); } + virtual LorgnetteManagerClient* GetLorgnetteManagerClient() OVERRIDE { + return client_bundle_->lorgnette_manager_client(); + } + virtual ShillDeviceClient* GetShillDeviceClient() OVERRIDE { return client_bundle_->shill_device_client(); } @@ -578,6 +588,7 @@ void DBusThreadManager::InitializeClients() { InitClient(g_dbus_thread_manager->GetGsmSMSClient()); InitClient(g_dbus_thread_manager->GetImageBurnerClient()); InitClient(g_dbus_thread_manager->GetIntrospectableClient()); + InitClient(g_dbus_thread_manager->GetLorgnetteManagerClient()); InitClient(g_dbus_thread_manager->GetModemMessagingClient()); InitClient(g_dbus_thread_manager->GetPermissionBrokerClient()); InitClient(g_dbus_thread_manager->GetPowerManagerClient()); diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h index 7253623..b1d395d 100644 --- a/chromeos/dbus/dbus_thread_manager.h +++ b/chromeos/dbus/dbus_thread_manager.h @@ -43,6 +43,7 @@ class DebugDaemonClient; class GsmSMSClient; class ImageBurnerClient; class IntrospectableClient; +class LorgnetteManagerClient; class ModemMessagingClient; class NfcAdapterClient; class NfcDeviceClient; @@ -142,6 +143,7 @@ class CHROMEOS_EXPORT DBusThreadManager { virtual GsmSMSClient* GetGsmSMSClient() = 0; virtual ImageBurnerClient* GetImageBurnerClient() = 0; virtual IntrospectableClient* GetIntrospectableClient() = 0; + virtual LorgnetteManagerClient* GetLorgnetteManagerClient() = 0; virtual ModemMessagingClient* GetModemMessagingClient() = 0; virtual NfcAdapterClient* GetNfcAdapterClient() = 0; virtual NfcDeviceClient* GetNfcDeviceClient() = 0; diff --git a/chromeos/dbus/fake_dbus_thread_manager.cc b/chromeos/dbus/fake_dbus_thread_manager.cc index 4ba7e78..10b7835 100644 --- a/chromeos/dbus/fake_dbus_thread_manager.cc +++ b/chromeos/dbus/fake_dbus_thread_manager.cc @@ -25,6 +25,7 @@ #include "chromeos/dbus/fake_gsm_sms_client.h" #include "chromeos/dbus/fake_image_burner_client.h" #include "chromeos/dbus/fake_introspectable_client.h" +#include "chromeos/dbus/fake_lorgnette_manager_client.h" #include "chromeos/dbus/fake_modem_messaging_client.h" #include "chromeos/dbus/fake_nfc_adapter_client.h" #include "chromeos/dbus/fake_nfc_device_client.h" @@ -82,6 +83,8 @@ void FakeDBusThreadManager::SetFakeClients() { SetCryptohomeClient(scoped_ptr<CryptohomeClient>(new FakeCryptohomeClient)); SetDebugDaemonClient( scoped_ptr<DebugDaemonClient>(new FakeDebugDaemonClient)); + SetLorgnetteManagerClient( + scoped_ptr<LorgnetteManagerClient>(new FakeLorgnetteManagerClient)); SetFakeShillClients(); @@ -202,6 +205,11 @@ void FakeDBusThreadManager::SetDebugDaemonClient( debug_daemon_client_ = client.Pass(); } +void FakeDBusThreadManager::SetLorgnetteManagerClient( + scoped_ptr<LorgnetteManagerClient> client) { + lorgnette_manager_client_ = client.Pass(); +} + void FakeDBusThreadManager::SetShillDeviceClient( scoped_ptr<ShillDeviceClient> client) { shill_device_client_ = client.Pass(); @@ -383,6 +391,10 @@ DebugDaemonClient* FakeDBusThreadManager::GetDebugDaemonClient() { return debug_daemon_client_.get(); } +LorgnetteManagerClient* FakeDBusThreadManager::GetLorgnetteManagerClient() { + return lorgnette_manager_client_.get(); +} + ShillDeviceClient* FakeDBusThreadManager::GetShillDeviceClient() { return shill_device_client_.get(); diff --git a/chromeos/dbus/fake_dbus_thread_manager.h b/chromeos/dbus/fake_dbus_thread_manager.h index ce02567..b3d308c 100644 --- a/chromeos/dbus/fake_dbus_thread_manager.h +++ b/chromeos/dbus/fake_dbus_thread_manager.h @@ -56,6 +56,7 @@ class CHROMEOS_EXPORT FakeDBusThreadManager : public DBusThreadManager { void SetCrosDisksClient(scoped_ptr<CrosDisksClient> client); void SetCryptohomeClient(scoped_ptr<CryptohomeClient> client); void SetDebugDaemonClient(scoped_ptr<DebugDaemonClient> client); + void SetLorgnetteManagerClient(scoped_ptr<LorgnetteManagerClient> client); void SetShillDeviceClient(scoped_ptr<ShillDeviceClient> client); void SetShillIPConfigClient(scoped_ptr<ShillIPConfigClient> client); void SetShillManagerClient(scoped_ptr<ShillManagerClient> client); @@ -99,6 +100,7 @@ class CHROMEOS_EXPORT FakeDBusThreadManager : public DBusThreadManager { virtual CrosDisksClient* GetCrosDisksClient() OVERRIDE; virtual CryptohomeClient* GetCryptohomeClient() OVERRIDE; virtual DebugDaemonClient* GetDebugDaemonClient() OVERRIDE; + virtual LorgnetteManagerClient* GetLorgnetteManagerClient() OVERRIDE; virtual ShillDeviceClient* GetShillDeviceClient() OVERRIDE; virtual ShillIPConfigClient* GetShillIPConfigClient() OVERRIDE; virtual ShillManagerClient* GetShillManagerClient() OVERRIDE; @@ -141,6 +143,7 @@ class CHROMEOS_EXPORT FakeDBusThreadManager : public DBusThreadManager { scoped_ptr<CrosDisksClient> cros_disks_client_; scoped_ptr<CryptohomeClient> cryptohome_client_; scoped_ptr<DebugDaemonClient> debug_daemon_client_; + scoped_ptr<LorgnetteManagerClient> lorgnette_manager_client_; scoped_ptr<ShillDeviceClient> shill_device_client_; scoped_ptr<ShillIPConfigClient> shill_ipconfig_client_; scoped_ptr<ShillManagerClient> shill_manager_client_; diff --git a/chromeos/dbus/fake_lorgnette_manager_client.cc b/chromeos/dbus/fake_lorgnette_manager_client.cc new file mode 100644 index 0000000..16924b3 --- /dev/null +++ b/chromeos/dbus/fake_lorgnette_manager_client.cc @@ -0,0 +1,40 @@ +// Copyright 2014 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/fake_lorgnette_manager_client.h" + +#include <map> +#include <string> +#include <vector> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/location.h" +#include "base/message_loop/message_loop.h" + +namespace chromeos { + +FakeLorgnetteManagerClient::FakeLorgnetteManagerClient() {} + +FakeLorgnetteManagerClient::~FakeLorgnetteManagerClient() {} + +void FakeLorgnetteManagerClient::Init(dbus::Bus* bus) {} + +void FakeLorgnetteManagerClient::ListScanners( + const ListScannersCallback& callback) { + std::map<std::string, ScannerTableEntry> scanners; + base::MessageLoop::current()->PostTask(FROM_HERE, + base::Bind(callback, false, scanners)); +} + +void FakeLorgnetteManagerClient::ScanImage( + std::string device_name, + base::PlatformFile file, + const ScanProperties& properties, + const ScanImageCallback& callback) { + base::MessageLoop::current()->PostTask(FROM_HERE, + base::Bind(callback, false)); +} + +} // namespace chromeos diff --git a/chromeos/dbus/fake_lorgnette_manager_client.h b/chromeos/dbus/fake_lorgnette_manager_client.h new file mode 100644 index 0000000..7f514f5 --- /dev/null +++ b/chromeos/dbus/fake_lorgnette_manager_client.h @@ -0,0 +1,36 @@ +// Copyright 2014 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. + +#ifndef CHROMEOS_DBUS_FAKE_LORGNETTE_MANAGER_CLIENT_H_ +#define CHROMEOS_DBUS_FAKE_LORGNETTE_MANAGER_CLIENT_H_ + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "chromeos/dbus/lorgnette_manager_client.h" + +namespace chromeos { + +// Lorgnette LorgnetteManagerClient implementation used on Linux desktop, +// which does nothing. +class CHROMEOS_EXPORT FakeLorgnetteManagerClient + : public LorgnetteManagerClient { + public: + FakeLorgnetteManagerClient(); + virtual ~FakeLorgnetteManagerClient(); + + virtual void Init(dbus::Bus* bus) OVERRIDE; + + virtual void ListScanners(const ListScannersCallback& callback) OVERRIDE; + virtual void ScanImage(std::string device_name, + base::PlatformFile file, + const ScanProperties& properties, + const ScanImageCallback& callback) OVERRIDE; + + private: + DISALLOW_COPY_AND_ASSIGN(FakeLorgnetteManagerClient); +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_FAKE_LORGNETTE_MANAGER_CLIENT_H_ diff --git a/chromeos/dbus/lorgnette_manager_client.cc b/chromeos/dbus/lorgnette_manager_client.cc new file mode 100644 index 0000000..629a60a --- /dev/null +++ b/chromeos/dbus/lorgnette_manager_client.cc @@ -0,0 +1,201 @@ +// Copyright 2014 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/lorgnette_manager_client.h" + +#include <string> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/callback.h" +#include "base/location.h" +#include "base/memory/ref_counted_memory.h" +#include "base/platform_file.h" +#include "base/threading/worker_pool.h" +#include "dbus/bus.h" +#include "dbus/message.h" +#include "dbus/object_path.h" +#include "dbus/object_proxy.h" +#include "net/base/file_stream.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +namespace chromeos { + +// The LorgnetteManagerClient implementation used in production. +class LorgnetteManagerClientImpl : public LorgnetteManagerClient { + public: + LorgnetteManagerClientImpl() : + lorgnette_daemon_proxy_(NULL), weak_ptr_factory_(this) {} + + virtual ~LorgnetteManagerClientImpl() {} + + virtual void ListScanners(const ListScannersCallback& callback) OVERRIDE { + dbus::MethodCall method_call(lorgnette::kManagerServiceInterface, + lorgnette::kListScannersMethod); + lorgnette_daemon_proxy_->CallMethod( + &method_call, + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::Bind(&LorgnetteManagerClientImpl::OnListScanners, + weak_ptr_factory_.GetWeakPtr(), + callback)); + } + + // LorgnetteManagerClient override. + virtual void ScanImage(std::string device_name, + base::PlatformFile file, + const ScanProperties& properties, + const ScanImageCallback& callback) OVERRIDE { + dbus::FileDescriptor* file_descriptor = new dbus::FileDescriptor(); + file_descriptor->PutValue(file); + // Punt descriptor validity check to a worker thread; on return we'll + // issue the D-Bus request to stop tracing and collect results. + base::WorkerPool::PostTaskAndReply( + FROM_HERE, + base::Bind(&LorgnetteManagerClientImpl::CheckValidity, + file_descriptor), + base::Bind(&LorgnetteManagerClientImpl::OnCheckValidityScanImage, + weak_ptr_factory_.GetWeakPtr(), + base::Owned(file_descriptor), + device_name, + properties, + callback), + false); + } + + protected: + virtual void Init(dbus::Bus* bus) OVERRIDE { + lorgnette_daemon_proxy_ = + bus->GetObjectProxy(lorgnette::kManagerServiceName, + dbus::ObjectPath(lorgnette::kManagerServicePath)); + } + + private: + // Called when ListScanners completes. + void OnListScanners(const ListScannersCallback& callback, + dbus::Response* response) { + ScannerTable scanners; + dbus::MessageReader table_reader(NULL); + if (!response || !dbus::MessageReader(response).PopArray(&table_reader)) { + callback.Run(false, scanners); + return; + } + + bool decode_failure = false; + while (table_reader.HasMoreData()) { + std::string device_name; + dbus::MessageReader device_entry_reader(NULL); + dbus::MessageReader device_element_reader(NULL); + if (!table_reader.PopDictEntry(&device_entry_reader) || + !device_entry_reader.PopString(&device_name) || + !device_entry_reader.PopArray(&device_element_reader)) { + decode_failure = true; + break; + } + + ScannerTableEntry scanner_entry; + while (device_element_reader.HasMoreData()) { + dbus::MessageReader device_attribute_reader(NULL); + std::string attribute; + std::string value; + if (!device_element_reader.PopDictEntry(&device_attribute_reader) || + !device_attribute_reader.PopString(&attribute) || + !device_attribute_reader.PopString(&value)) { + decode_failure = true; + break; + } + scanner_entry[attribute] = value; + } + + if (decode_failure) + break; + + scanners[device_name] = scanner_entry; + } + + if (decode_failure) { + LOG(ERROR) << "Failed to decode response from ListScanners"; + callback.Run(false, scanners); + } else { + callback.Run(true, scanners); + } + } + + // Called to check descriptor validity on a thread where i/o is permitted. + static void CheckValidity(dbus::FileDescriptor* file_descriptor) { + file_descriptor->CheckValidity(); + } + + // Called when a CheckValidity response is received. + void OnCheckValidityScanImage( + dbus::FileDescriptor* file_descriptor, + std::string device_name, + const ScanProperties& properties, + const ScanImageCallback& callback) { + if (!file_descriptor->is_valid()) { + LOG(ERROR) << "Failed to scan image: file descriptor is invalid"; + callback.Run(false); + return; + } + // Issue the dbus request to scan an image. + dbus::MethodCall method_call( + lorgnette::kManagerServiceInterface, + lorgnette::kScanImageMethod); + dbus::MessageWriter writer(&method_call); + writer.AppendString(device_name); + writer.AppendFileDescriptor(*file_descriptor); + + dbus::MessageWriter option_writer(NULL); + dbus::MessageWriter element_writer(NULL); + writer.OpenArray("{sv}", &option_writer); + if (!properties.mode.empty()) { + option_writer.OpenDictEntry(&element_writer); + element_writer.AppendString(lorgnette::kScanPropertyMode); + element_writer.AppendVariantOfString(properties.mode); + option_writer.CloseContainer(&element_writer); + } + if (properties.resolution_dpi) { + option_writer.OpenDictEntry(&element_writer); + element_writer.AppendString(lorgnette::kScanPropertyResolution); + element_writer.AppendVariantOfUint32(properties.resolution_dpi); + option_writer.CloseContainer(&element_writer); + } + writer.CloseContainer(&option_writer); + + lorgnette_daemon_proxy_->CallMethod( + &method_call, + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::Bind(&LorgnetteManagerClientImpl::OnScanImageComplete, + weak_ptr_factory_.GetWeakPtr(), + callback)); + } + + // Called when a response for ScanImage() is received. + void OnScanImageComplete(const ScanImageCallback& callback, + dbus::Response* response) { + if (!response) { + LOG(ERROR) << "Failed to scan image"; + callback.Run(false); + return; + } + callback.Run(true); + } + + dbus::ObjectProxy* lorgnette_daemon_proxy_; + base::WeakPtrFactory<LorgnetteManagerClientImpl> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(LorgnetteManagerClientImpl); +}; + +LorgnetteManagerClient::LorgnetteManagerClient() { +} + +LorgnetteManagerClient::~LorgnetteManagerClient() { +} + +// static +LorgnetteManagerClient* LorgnetteManagerClient::Create() { + return new LorgnetteManagerClientImpl(); +} + +} // namespace chromeos diff --git a/chromeos/dbus/lorgnette_manager_client.h b/chromeos/dbus/lorgnette_manager_client.h new file mode 100644 index 0000000..2f3103e --- /dev/null +++ b/chromeos/dbus/lorgnette_manager_client.h @@ -0,0 +1,68 @@ +// Copyright 2014 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. + +#ifndef CHROMEOS_DBUS_LORGNETTE_MANAGER_CLIENT_H_ +#define CHROMEOS_DBUS_LORGNETTE_MANAGER_CLIENT_H_ + +#include <map> + +#include "base/callback.h" +#include "base/memory/ref_counted_memory.h" +#include "base/platform_file.h" +#include "chromeos/chromeos_export.h" +#include "chromeos/dbus/dbus_client.h" + +namespace chromeos { + +// LorgnetteManagerClient is used to communicate with the lorgnette +// document scanning daemon. +class CHROMEOS_EXPORT LorgnetteManagerClient : public DBusClient { + public: + // The property information for each scanner retured by ListScanners. + typedef std::map<std::string, std::string> ScannerTableEntry; + typedef std::map<std::string, ScannerTableEntry> ScannerTable; + + // Callback type for ListScanners(). Returns a map which contains + // a ScannerTableEntry for each available scanner. + typedef base::Callback<void( + bool succeeded, const ScannerTable&)> ListScannersCallback; + + // Called once ScanImage() is complete. Takes one parameter: + // - succeeded: was the scan completed successfully. + typedef base::Callback<void(bool succeeded)> ScanImageCallback; + + // Attributes provided to a scan request. + struct ScanProperties { + ScanProperties() : resolution_dpi(0) {} + std::string mode; // Can be "Color", "Gray", or "Lineart". + int resolution_dpi; + }; + + virtual ~LorgnetteManagerClient(); + + // Gets a list of scanners from the lorgnette manager. + virtual void ListScanners(const ListScannersCallback& callback) = 0; + + // Request a scanned image and calls |callback| when completed. + // Image data will be stored in the .png format. + virtual void ScanImage(std::string device_name, + base::PlatformFile file, + const ScanProperties& properties, + const ScanImageCallback& callback) = 0; + + // Factory function, creates a new instance and returns ownership. + // For normal usage, access the singleton via DBusThreadManager::Get(). + static LorgnetteManagerClient* Create(); + + protected: + // Create() should be used instead. + LorgnetteManagerClient(); + + private: + DISALLOW_COPY_AND_ASSIGN(LorgnetteManagerClient); +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_LORGNETTE_MANAGER_CLIENT_H_ |