Index: chrome/browser/chromeos/dbus/cros_disks_client.cc |
diff --git a/chrome/browser/chromeos/dbus/cros_disks_client.cc b/chrome/browser/chromeos/dbus/cros_disks_client.cc |
deleted file mode 100644 |
index 729c3458fa650615821bbf3837e51defa1aa2640..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/dbus/cros_disks_client.cc |
+++ /dev/null |
@@ -1,566 +0,0 @@ |
-// Copyright (c) 2012 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 "chrome/browser/chromeos/dbus/cros_disks_client.h" |
- |
-#include "base/bind.h" |
-#include "base/stl_util.h" |
-#include "dbus/bus.h" |
-#include "dbus/message.h" |
-#include "dbus/object_path.h" |
-#include "dbus/object_proxy.h" |
-#include "third_party/cros_system_api/dbus/service_constants.h" |
- |
-namespace chromeos { |
- |
-namespace { |
- |
-const char* kDefaultMountOptions[] = { |
- "rw", |
- "nodev", |
- "noexec", |
- "nosuid", |
-}; |
- |
-const char* kDefaultUnmountOptions[] = { |
- "force", |
-}; |
- |
-// Checks if retrieved media type is in boundaries of DeviceMediaType. |
-bool IsValidMediaType(uint32 type) { |
- return type < static_cast<uint32>(cros_disks::DEVICE_MEDIA_NUM_VALUES); |
-} |
- |
- |
-// Translates enum used in cros-disks to enum used in Chrome. |
-// Note that we could just do static_cast, but this is less sensitive to |
-// changes in cros-disks. |
-DeviceType DeviceMediaTypeToDeviceType(uint32 media_type_uint32) { |
- if (!IsValidMediaType(media_type_uint32)) |
- return DEVICE_TYPE_UNKNOWN; |
- |
- cros_disks::DeviceMediaType media_type = |
- cros_disks::DeviceMediaType(media_type_uint32); |
- |
- switch (media_type) { |
- case(cros_disks::DEVICE_MEDIA_UNKNOWN): |
- return DEVICE_TYPE_UNKNOWN; |
- case(cros_disks::DEVICE_MEDIA_USB): |
- return DEVICE_TYPE_USB; |
- case(cros_disks::DEVICE_MEDIA_SD): |
- return DEVICE_TYPE_SD; |
- case(cros_disks::DEVICE_MEDIA_OPTICAL_DISC): |
- return DEVICE_TYPE_OPTICAL_DISC; |
- case(cros_disks::DEVICE_MEDIA_MOBILE): |
- return DEVICE_TYPE_MOBILE; |
- default: |
- return DEVICE_TYPE_UNKNOWN; |
- } |
-} |
- |
-// Pops a bool value when |reader| is not NULL. |
-// Returns true when a value is popped, false otherwise. |
-bool MaybePopBool(dbus::MessageReader* reader, bool* value) { |
- if (!reader) |
- return false; |
- return reader->PopBool(value); |
-} |
- |
-// Pops a string value when |reader| is not NULL. |
-// Returns true when a value is popped, false otherwise. |
-bool MaybePopString(dbus::MessageReader* reader, std::string* value) { |
- if (!reader) |
- return false; |
- return reader->PopString(value); |
-} |
- |
-// Pops a uint32 value when |reader| is not NULL. |
-// Returns true when a value is popped, false otherwise. |
-bool MaybePopUint32(dbus::MessageReader* reader, uint32* value) { |
- if (!reader) |
- return false; |
- |
- return reader->PopUint32(value); |
-} |
- |
-// Pops a uint64 value when |reader| is not NULL. |
-// Returns true when a value is popped, false otherwise. |
-bool MaybePopUint64(dbus::MessageReader* reader, uint64* value) { |
- if (!reader) |
- return false; |
- return reader->PopUint64(value); |
-} |
- |
-// Pops an array of strings when |reader| is not NULL. |
-// Returns true when an array is popped, false otherwise. |
-bool MaybePopArrayOfStrings(dbus::MessageReader* reader, |
- std::vector<std::string>* value) { |
- if (!reader) |
- return false; |
- return reader->PopArrayOfStrings(value); |
-} |
- |
-// The CrosDisksClient implementation. |
-class CrosDisksClientImpl : public CrosDisksClient { |
- public: |
- explicit CrosDisksClientImpl(dbus::Bus* bus) |
- : proxy_(bus->GetObjectProxy( |
- cros_disks::kCrosDisksServiceName, |
- dbus::ObjectPath(cros_disks::kCrosDisksServicePath))), |
- weak_ptr_factory_(this) { |
- } |
- |
- // CrosDisksClient override. |
- virtual void Mount(const std::string& source_path, |
- MountType type, |
- MountCallback callback, |
- ErrorCallback error_callback) OVERRIDE { |
- dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, |
- cros_disks::kMount); |
- dbus::MessageWriter writer(&method_call); |
- writer.AppendString(source_path); |
- writer.AppendString(""); // auto detect filesystem. |
- std::vector<std::string> mount_options(kDefaultMountOptions, |
- kDefaultMountOptions + |
- arraysize(kDefaultMountOptions)); |
- writer.AppendArrayOfStrings(mount_options); |
- proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&CrosDisksClientImpl::OnMount, |
- weak_ptr_factory_.GetWeakPtr(), |
- callback, |
- error_callback)); |
- } |
- |
- // CrosDisksClient override. |
- virtual void Unmount(const std::string& device_path, |
- UnmountCallback callback, |
- ErrorCallback error_callback) OVERRIDE { |
- dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, |
- cros_disks::kUnmount); |
- dbus::MessageWriter writer(&method_call); |
- writer.AppendString(device_path); |
- std::vector<std::string> unmount_options(kDefaultUnmountOptions, |
- kDefaultUnmountOptions + |
- arraysize(kDefaultUnmountOptions)); |
- writer.AppendArrayOfStrings(unmount_options); |
- proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&CrosDisksClientImpl::OnUnmount, |
- weak_ptr_factory_.GetWeakPtr(), |
- device_path, |
- callback, |
- error_callback)); |
- } |
- |
- // CrosDisksClient override. |
- virtual void EnumerateAutoMountableDevices( |
- EnumerateAutoMountableDevicesCallback callback, |
- ErrorCallback error_callback) OVERRIDE { |
- dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, |
- cros_disks::kEnumerateAutoMountableDevices); |
- proxy_->CallMethod( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&CrosDisksClientImpl::OnEnumerateAutoMountableDevices, |
- weak_ptr_factory_.GetWeakPtr(), |
- callback, |
- error_callback)); |
- } |
- |
- // CrosDisksClient override. |
- virtual void FormatDevice(const std::string& device_path, |
- const std::string& filesystem, |
- FormatDeviceCallback callback, |
- ErrorCallback error_callback) OVERRIDE { |
- dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, |
- cros_disks::kFormatDevice); |
- dbus::MessageWriter writer(&method_call); |
- writer.AppendString(device_path); |
- writer.AppendString(filesystem); |
- proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&CrosDisksClientImpl::OnFormatDevice, |
- weak_ptr_factory_.GetWeakPtr(), |
- device_path, |
- callback, |
- error_callback)); |
- } |
- |
- // CrosDisksClient override. |
- virtual void GetDeviceProperties(const std::string& device_path, |
- GetDevicePropertiesCallback callback, |
- ErrorCallback error_callback) OVERRIDE { |
- dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, |
- cros_disks::kGetDeviceProperties); |
- dbus::MessageWriter writer(&method_call); |
- writer.AppendString(device_path); |
- proxy_->CallMethod(&method_call, |
- dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&CrosDisksClientImpl::OnGetDeviceProperties, |
- weak_ptr_factory_.GetWeakPtr(), |
- device_path, |
- callback, |
- error_callback)); |
- } |
- |
- // CrosDisksClient override. |
- virtual void SetUpConnections( |
- MountEventHandler mount_event_handler, |
- MountCompletedHandler mount_completed_handler) OVERRIDE { |
- static const SignalEventTuple kSignalEventTuples[] = { |
- { cros_disks::kDeviceAdded, DEVICE_ADDED }, |
- { cros_disks::kDeviceScanned, DEVICE_SCANNED }, |
- { cros_disks::kDeviceRemoved, DEVICE_REMOVED }, |
- { cros_disks::kDiskAdded, DISK_ADDED }, |
- { cros_disks::kDiskChanged, DISK_CHANGED }, |
- { cros_disks::kDiskRemoved, DISK_REMOVED }, |
- { cros_disks::kFormattingFinished, FORMATTING_FINISHED }, |
- }; |
- const size_t kNumSignalEventTuples = arraysize(kSignalEventTuples); |
- |
- for (size_t i = 0; i < kNumSignalEventTuples; ++i) { |
- proxy_->ConnectToSignal( |
- cros_disks::kCrosDisksInterface, |
- kSignalEventTuples[i].signal_name, |
- base::Bind(&CrosDisksClientImpl::OnMountEvent, |
- weak_ptr_factory_.GetWeakPtr(), |
- kSignalEventTuples[i].event_type, |
- mount_event_handler), |
- base::Bind(&CrosDisksClientImpl::OnSignalConnected, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- proxy_->ConnectToSignal( |
- cros_disks::kCrosDisksInterface, |
- cros_disks::kMountCompleted, |
- base::Bind(&CrosDisksClientImpl::OnMountCompleted, |
- weak_ptr_factory_.GetWeakPtr(), |
- mount_completed_handler ), |
- base::Bind(&CrosDisksClientImpl::OnSignalConnected, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- private: |
- // A struct to contain a pair of signal name and mount event type. |
- // Used by SetUpConnections. |
- struct SignalEventTuple { |
- const char *signal_name; |
- MountEventType event_type; |
- }; |
- |
- // Handles the result of Mount and calls |callback| or |error_callback|. |
- void OnMount(MountCallback callback, |
- ErrorCallback error_callback, |
- dbus::Response* response) { |
- if (!response) { |
- error_callback.Run(); |
- return; |
- } |
- callback.Run(); |
- } |
- |
- // Handles the result of Unount and calls |callback| or |error_callback|. |
- void OnUnmount(const std::string& device_path, |
- UnmountCallback callback, |
- ErrorCallback error_callback, |
- dbus::Response* response) { |
- if (!response) { |
- error_callback.Run(); |
- return; |
- } |
- callback.Run(device_path); |
- } |
- |
- // Handles the result of EnumerateAutoMountableDevices and calls |callback| or |
- // |error_callback|. |
- void OnEnumerateAutoMountableDevices( |
- EnumerateAutoMountableDevicesCallback callback, |
- ErrorCallback error_callback, |
- dbus::Response* response) { |
- if (!response) { |
- error_callback.Run(); |
- return; |
- } |
- dbus::MessageReader reader(response); |
- std::vector<std::string> device_paths; |
- if (!reader.PopArrayOfStrings(&device_paths)) { |
- LOG(ERROR) << "Invalid response: " << response->ToString(); |
- error_callback.Run(); |
- return; |
- } |
- callback.Run(device_paths); |
- } |
- |
- // Handles the result of FormatDevice and calls |callback| or |
- // |error_callback|. |
- void OnFormatDevice(const std::string& device_path, |
- FormatDeviceCallback callback, |
- ErrorCallback error_callback, |
- dbus::Response* response) { |
- if (!response) { |
- error_callback.Run(); |
- return; |
- } |
- dbus::MessageReader reader(response); |
- bool success = false; |
- if (!reader.PopBool(&success)) { |
- LOG(ERROR) << "Invalid response: " << response->ToString(); |
- error_callback.Run(); |
- return; |
- } |
- callback.Run(device_path, success); |
- } |
- |
- // Handles the result of GetDeviceProperties and calls |callback| or |
- // |error_callback|. |
- void OnGetDeviceProperties(const std::string& device_path, |
- GetDevicePropertiesCallback callback, |
- ErrorCallback error_callback, |
- dbus::Response* response) { |
- if (!response) { |
- error_callback.Run(); |
- return; |
- } |
- DiskInfo disk(device_path, response); |
- callback.Run(disk); |
- } |
- |
- // Handles mount event signals and calls |handler|. |
- void OnMountEvent(MountEventType event_type, |
- MountEventHandler handler, |
- dbus::Signal* signal) { |
- dbus::MessageReader reader(signal); |
- std::string device; |
- if (!reader.PopString(&device)) { |
- LOG(ERROR) << "Invalid signal: " << signal->ToString(); |
- return; |
- } |
- handler.Run(event_type, device); |
- } |
- |
- // Handles MountCompleted signal and calls |handler|. |
- void OnMountCompleted(MountCompletedHandler handler, dbus::Signal* signal) { |
- dbus::MessageReader reader(signal); |
- unsigned int error_code = 0; |
- std::string source_path; |
- unsigned int mount_type = 0; |
- std::string mount_path; |
- if (!reader.PopUint32(&error_code) || |
- !reader.PopString(&source_path) || |
- !reader.PopUint32(&mount_type) || |
- !reader.PopString(&mount_path)) { |
- LOG(ERROR) << "Invalid signal: " << signal->ToString(); |
- return; |
- } |
- handler.Run(static_cast<MountError>(error_code), source_path, |
- static_cast<MountType>(mount_type), mount_path); |
- } |
- |
- // Handles the result of signal connection setup. |
- void OnSignalConnected(const std::string& interface, |
- const std::string& signal, |
- bool successed) { |
- LOG_IF(ERROR, !successed) << "Connect to " << interface << " " << |
- signal << " failed."; |
- } |
- |
- dbus::ObjectProxy* proxy_; |
- base::WeakPtrFactory<CrosDisksClientImpl> weak_ptr_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CrosDisksClientImpl); |
-}; |
- |
-// A stub implementaion of CrosDisksClient. |
-class CrosDisksClientStubImpl : public CrosDisksClient { |
- public: |
- CrosDisksClientStubImpl() {} |
- virtual ~CrosDisksClientStubImpl() {} |
- |
- virtual void Mount(const std::string& source_path, |
- MountType type, |
- MountCallback callback, |
- ErrorCallback error_callback) OVERRIDE {} |
- virtual void Unmount(const std::string& device_path, |
- UnmountCallback callback, |
- ErrorCallback error_callback) OVERRIDE {} |
- virtual void EnumerateAutoMountableDevices( |
- EnumerateAutoMountableDevicesCallback callback, |
- ErrorCallback error_callback) OVERRIDE {} |
- virtual void FormatDevice(const std::string& device_path, |
- const std::string& filesystem, |
- FormatDeviceCallback callback, |
- ErrorCallback error_callback) OVERRIDE {} |
- virtual void GetDeviceProperties(const std::string& device_path, |
- GetDevicePropertiesCallback callback, |
- ErrorCallback error_callback) OVERRIDE {} |
- virtual void SetUpConnections( |
- MountEventHandler mount_event_handler, |
- MountCompletedHandler mount_completed_handler) OVERRIDE {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(CrosDisksClientStubImpl); |
-}; |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DiskInfo |
- |
-DiskInfo::DiskInfo(const std::string& device_path, dbus::Response* response) |
- : device_path_(device_path), |
- is_drive_(false), |
- has_media_(false), |
- on_boot_device_(false), |
- device_type_(DEVICE_TYPE_UNKNOWN), |
- total_size_in_bytes_(0), |
- is_read_only_(false), |
- is_hidden_(true) { |
- InitializeFromResponse(response); |
-} |
- |
-DiskInfo::~DiskInfo() { |
-} |
- |
-// Initialize |this| from |response| given by the cros-disks service. |
-// Below is an example of |response|'s raw message (long string is ellipsized). |
-// |
-// |
-// message_type: MESSAGE_METHOD_RETURN |
-// destination: :1.8 |
-// sender: :1.16 |
-// signature: a{sv} |
-// serial: 96 |
-// reply_serial: 267 |
-// |
-// array [ |
-// dict entry { |
-// string "DeviceFile" |
-// variant string "/dev/sdb" |
-// } |
-// dict entry { |
-// string "DeviceIsDrive" |
-// variant bool true |
-// } |
-// dict entry { |
-// string "DeviceIsMediaAvailable" |
-// variant bool true |
-// } |
-// dict entry { |
-// string "DeviceIsMounted" |
-// variant bool false |
-// } |
-// dict entry { |
-// string "DeviceIsOnBootDevice" |
-// variant bool false |
-// } |
-// dict entry { |
-// string "DeviceIsOpticalDisc" |
-// variant bool false |
-// } |
-// dict entry { |
-// string "DeviceIsReadOnly" |
-// variant bool false |
-// } |
-// dict entry { |
-// string "DeviceIsVirtual" |
-// variant bool false |
-// } |
-// dict entry { |
-// string "DeviceMediaType" |
-// variant uint32 1 |
-// } |
-// dict entry { |
-// string "DeviceMountPaths" |
-// variant array [ |
-// ] |
-// } |
-// dict entry { |
-// string "DevicePresentationHide" |
-// variant bool true |
-// } |
-// dict entry { |
-// string "DeviceSize" |
-// variant uint64 7998537728 |
-// } |
-// dict entry { |
-// string "DriveIsRotational" |
-// variant bool false |
-// } |
-// dict entry { |
-// string "DriveModel" |
-// variant string "TransMemory" |
-// } |
-// dict entry { |
-// string "IdLabel" |
-// variant string "" |
-// } |
-// dict entry { |
-// string "IdUuid" |
-// variant string "" |
-// } |
-// dict entry { |
-// string "NativePath" |
-// variant string "/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-4/... |
-// } |
-// ] |
-void DiskInfo::InitializeFromResponse(dbus::Response* response) { |
- dbus::MessageReader response_reader(response); |
- dbus::MessageReader array_reader(response); |
- if (!response_reader.PopArray(&array_reader)) { |
- LOG(ERROR) << "Invalid response: " << response->ToString(); |
- return; |
- } |
- // TODO(satorux): Rework this code using Protocol Buffers. crosbug.com/22626 |
- typedef std::map<std::string, dbus::MessageReader*> PropertiesMap; |
- PropertiesMap properties; |
- STLValueDeleter<PropertiesMap> properties_value_deleter(&properties); |
- while (array_reader.HasMoreData()) { |
- dbus::MessageReader* value_reader = new dbus::MessageReader(response); |
- dbus::MessageReader dict_entry_reader(response); |
- std::string key; |
- if (!array_reader.PopDictEntry(&dict_entry_reader) || |
- !dict_entry_reader.PopString(&key) || |
- !dict_entry_reader.PopVariant(value_reader)) { |
- LOG(ERROR) << "Invalid response: " << response->ToString(); |
- return; |
- } |
- properties[key] = value_reader; |
- } |
- MaybePopBool(properties[cros_disks::kDeviceIsDrive], &is_drive_); |
- MaybePopBool(properties[cros_disks::kDeviceIsReadOnly], &is_read_only_); |
- MaybePopBool(properties[cros_disks::kDevicePresentationHide], &is_hidden_); |
- MaybePopBool(properties[cros_disks::kDeviceIsMediaAvailable], &has_media_); |
- MaybePopBool(properties[cros_disks::kDeviceIsOnBootDevice], |
- &on_boot_device_); |
- MaybePopString(properties[cros_disks::kNativePath], &system_path_); |
- MaybePopString(properties[cros_disks::kDeviceFile], &file_path_); |
- MaybePopString(properties[cros_disks::kDriveModel], &drive_model_); |
- MaybePopString(properties[cros_disks::kIdLabel], &label_); |
- MaybePopUint64(properties[cros_disks::kDeviceSize], &total_size_in_bytes_); |
- |
- uint32 media_type_uint32 = 0; |
- if (MaybePopUint32(properties[cros_disks::kDeviceMediaType], |
- &media_type_uint32)) { |
- device_type_ = DeviceMediaTypeToDeviceType(media_type_uint32); |
- } |
- |
- std::vector<std::string> mount_paths; |
- if (MaybePopArrayOfStrings(properties[cros_disks::kDeviceMountPaths], |
- &mount_paths) && !mount_paths.empty()) |
- mount_path_ = mount_paths[0]; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// CrosDisksClient |
- |
-CrosDisksClient::CrosDisksClient() {} |
- |
-CrosDisksClient::~CrosDisksClient() {} |
- |
-// static |
-CrosDisksClient* CrosDisksClient::Create(DBusClientImplementationType type, |
- dbus::Bus* bus) { |
- if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) |
- return new CrosDisksClientImpl(bus); |
- DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
- return new CrosDisksClientStubImpl(); |
-} |
- |
-} // namespace chromeos |