| // Copyright (c) 2012 The Chromium OS 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 MTPD_MTPD_SERVER_IMPL_H_ |
| #define MTPD_MTPD_SERVER_IMPL_H_ |
| |
| #include <map> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include <base/compiler_specific.h> |
| #include <base/macros.h> |
| #include <brillo/dbus/async_event_sequencer.h> |
| #include <brillo/dbus/dbus_object.h> |
| #include <brillo/errors/error.h> |
| #include <dbus/bus.h> |
| |
| #include "mtpd/dbus_adaptors/org.chromium.Mtpd.h" |
| #include "mtpd/device_event_delegate.h" |
| #include "mtpd/device_manager.h" |
| #include "mtpd/file_entry.h" |
| |
| namespace mtpd { |
| |
| class DeviceManager; |
| |
| // The D-bus server for the mtpd daemon. |
| class MtpdServer : public org::chromium::MtpdInterface, |
| public org::chromium::MtpdAdaptor, |
| public DeviceEventDelegate { |
| public: |
| explicit MtpdServer(scoped_refptr<dbus::Bus> bus); |
| virtual ~MtpdServer(); |
| |
| // org::chromium::MtpdAdaptor implementation. |
| std::vector<std::string> EnumerateStorages() override; |
| std::vector<uint8_t> GetStorageInfo(const std::string& storage_name) override; |
| std::vector<uint8_t> GetStorageInfoFromDevice( |
| const std::string& storage_name) override; |
| bool OpenStorage(brillo::ErrorPtr* error, |
| const std::string& storage_name, |
| const std::string& mode, |
| std::string* id) override; |
| bool CloseStorage(brillo::ErrorPtr* error, |
| const std::string& handle) override; |
| bool ReadDirectoryEntryIds(brillo::ErrorPtr* error, |
| const std::string& handle, |
| uint32_t file_id, |
| std::vector<uint32_t>* directory_listing) override; |
| bool GetFileInfo(brillo::ErrorPtr* error, |
| const std::string& handle, |
| const std::vector<uint32_t>& file_ids, |
| std::vector<uint8_t>* serialized_file_entries) override; |
| bool ReadFileChunk(brillo::ErrorPtr* error, |
| const std::string& handle, |
| uint32_t file_id, |
| uint32_t offset, |
| uint32_t count, |
| std::vector<uint8_t>* file_contents) override; |
| bool CopyFileFromLocal(brillo::ErrorPtr* error, |
| const std::string& handle, |
| const base::ScopedFD& file_descriptor, |
| uint32_t parent_id, |
| const std::string& file_name) override; |
| bool DeleteObject(brillo::ErrorPtr* error, |
| const std::string& handle, |
| uint32_t object_id) override; |
| bool RenameObject(brillo::ErrorPtr* error, |
| const std::string& handle, |
| uint32_t object_id, |
| const std::string& new_name) override; |
| bool CreateDirectory(brillo::ErrorPtr* error, |
| const std::string& handle, |
| uint32_t parent_id, |
| const std::string& directory_name) override; |
| bool IsAlive() override; |
| |
| // DeviceEventDelegate implementation. |
| void StorageAttached(const std::string& storage_name) override; |
| void StorageDetached(const std::string& storage_name) override; |
| |
| // Returns a file descriptor for monitoring device events. |
| int GetDeviceEventDescriptor() const; |
| |
| // Processes the available device events. |
| void ProcessDeviceEvents(); |
| |
| // Register D-Bus object. |
| void RegisterAsync( |
| const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb); |
| |
| private: |
| // StorageHandleInfo is a pair of StorageName and Mode. |
| using StorageHandleInfo = std::pair<std::string, std::string>; |
| |
| // Handle to StorageHandleInfo map. |
| using HandleMap = std::map<std::string, StorageHandleInfo>; |
| |
| // Returns the StorageName for a handle, or an empty string on failure. |
| std::string LookupHandle(const std::string& handle); |
| |
| // Returns true if the storage is opened with write access. |
| bool IsOpenedWithWrite(const std::string& handle); |
| |
| HandleMap handle_map_; |
| |
| // Exported D-Bus object. |
| brillo::dbus_utils::DBusObject dbus_object_; |
| |
| // Device manager needs to be last, so it is the first to be destroyed. |
| DeviceManager device_manager_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MtpdServer); |
| }; |
| |
| } // namespace mtpd |
| |
| #endif // MTPD_MTPD_SERVER_IMPL_H_ |