blob: f24251eedf9457e936c6f95d1b9f7fe7fdb1d34a [file] [log] [blame]
// Copyright 2013 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 CHROME_BROWSER_MEDIA_GALLERIES_LINUX_MTP_DEVICE_TASK_HELPER_H_
#define CHROME_BROWSER_MEDIA_GALLERIES_LINUX_MTP_DEVICE_TASK_HELPER_H_
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h"
#include "device/media_transfer_protocol/mtp_file_entry.pb.h"
#include "webkit/browser/fileapi/async_file_util.h"
class MTPReadFileWorker;
struct SnapshotRequestInfo;
// MTPDeviceTaskHelper dispatches the media transfer protocol (MTP) device
// operation requests (such as GetFileInfo, ReadDirectory, CreateSnapshotFile,
// OpenStorage and CloseStorage) to the MediaTransferProtocolManager.
// MTPDeviceTaskHelper lives on the UI thread. MTPDeviceTaskHelperMapService
// owns the MTPDeviceTaskHelper objects. MTPDeviceTaskHelper is instantiated per
// MTP device storage.
class MTPDeviceTaskHelper {
public:
typedef base::Callback<void(bool succeeded)> OpenStorageCallback;
typedef MTPDeviceAsyncDelegate::GetFileInfoSuccessCallback
GetFileInfoSuccessCallback;
// NOTE: The file names in the entry list have their file id appended at the
// end. e.g. foo.jpg with file id 45 becomes foo.jpg,45.
typedef base::Callback<void(const fileapi::AsyncFileUtil::EntryList& entries,
bool has_more)> ReadDirectorySuccessCallback;
typedef MTPDeviceAsyncDelegate::ErrorCallback ErrorCallback;
MTPDeviceTaskHelper();
~MTPDeviceTaskHelper();
// Dispatches the request to the MediaTransferProtocolManager to open the MTP
// storage for communication.
//
// |storage_name| specifies the name of the storage device.
// |callback| is called when the OpenStorage request completes. |callback|
// runs on the IO thread.
void OpenStorage(const std::string& storage_name,
const OpenStorageCallback& callback);
// Dispatches the GetFileInfo request to the MediaTransferProtocolManager.
//
// |file_id| specifies the id of the file whose details are requested.
//
// If the file details are fetched successfully, |success_callback| is invoked
// on the IO thread to notify the caller about the file details.
//
// If there is an error, |error_callback| is invoked on the IO thread to
// notify the caller about the file error.
void GetFileInfo(uint32 file_id,
const GetFileInfoSuccessCallback& success_callback,
const ErrorCallback& error_callback);
// Dispatches the read directory request to the MediaTransferProtocolManager.
//
// |dir_id| specifies the directory id.
//
// If the directory file entries are enumerated successfully,
// |success_callback| is invoked on the IO thread to notify the caller about
// the directory file entries. Please see the note in the
// ReadDirectorySuccessCallback typedef regarding the special treatment of
// file names.
//
// If there is an error, |error_callback| is invoked on the IO thread to
// notify the caller about the file error.
void ReadDirectory(uint32 dir_id,
const ReadDirectorySuccessCallback& success_callback,
const ErrorCallback& error_callback);
// Forwards the WriteDataIntoSnapshotFile request to the MTPReadFileWorker
// object.
//
// |request_info| specifies the snapshot file request params.
// |snapshot_file_info| specifies the metadata of the snapshot file.
void WriteDataIntoSnapshotFile(
const SnapshotRequestInfo& request_info,
const base::File::Info& snapshot_file_info);
// Dispatches the read bytes request to the MediaTransferProtocolManager.
//
// |request| contains details about the byte request including the file path,
// byte range, and the callbacks. The callbacks specified within |request| are
// called on the IO thread to notify the caller about success or failure.
void ReadBytes(const MTPDeviceAsyncDelegate::ReadBytesRequest& request);
// Dispatches the CloseStorage request to the MediaTransferProtocolManager.
void CloseStorage() const;
private:
// Query callback for OpenStorage() to run |callback| on the IO thread.
//
// If OpenStorage request succeeds, |error| is set to false and
// |device_handle| contains the handle to communicate with the MTP device.
//
// If OpenStorage request fails, |error| is set to true and |device_handle| is
// set to an empty string.
void OnDidOpenStorage(const OpenStorageCallback& callback,
const std::string& device_handle,
bool error);
// Query callback for GetFileInfo().
//
// If there is no error, |file_entry| will contain the
// requested media device file details and |error| is set to false.
// |success_callback| is invoked on the IO thread to notify the caller.
//
// If there is an error, |file_entry| is invalid and |error| is
// set to true. |error_callback| is invoked on the IO thread to notify the
// caller.
void OnGetFileInfo(const GetFileInfoSuccessCallback& success_callback,
const ErrorCallback& error_callback,
const MtpFileEntry& file_entry,
bool error) const;
// Query callback for ReadDirectory().
//
// If there is no error, |error| is set to false, |file_entries| has the
// directory file entries and |success_callback| is invoked on the IO thread
// to notify the caller.
//
// If there is an error, |error| is set to true, |file_entries| is empty
// and |error_callback| is invoked on the IO thread to notify the caller.
void OnDidReadDirectory(const ReadDirectorySuccessCallback& success_callback,
const ErrorCallback& error_callback,
const std::vector<MtpFileEntry>& file_entries,
bool has_more,
bool error) const;
// Intermediate step to finish a ReadBytes request.
void OnGetFileInfoToReadBytes(
const MTPDeviceAsyncDelegate::ReadBytesRequest& request,
const MtpFileEntry& file_entry,
bool error);
// Query callback for ReadBytes();
//
// If there is no error, |error| is set to false, the buffer within |request|
// is written to, and the success callback within |request| is invoked on the
// IO thread to notify the caller.
//
// If there is an error, |error| is set to true, the buffer within |request|
// is untouched, and the error callback within |request| is invoked on the
// IO thread to notify the caller.
void OnDidReadBytes(
const MTPDeviceAsyncDelegate::ReadBytesRequest& request,
const base::File::Info& file_info,
const std::string& data,
bool error) const;
// Called when the device is uninitialized.
//
// Runs |error_callback| on the IO thread to notify the caller about the
// device |error|.
void HandleDeviceError(const ErrorCallback& error_callback,
base::File::Error error) const;
// Handle to communicate with the MTP device.
std::string device_handle_;
// Used to handle WriteDataInfoSnapshotFile request.
scoped_ptr<MTPReadFileWorker> read_file_worker_;
// For callbacks that may run after destruction.
base::WeakPtrFactory<MTPDeviceTaskHelper> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(MTPDeviceTaskHelper);
};
#endif // CHROME_BROWSER_MEDIA_GALLERIES_LINUX_MTP_DEVICE_TASK_HELPER_H_