12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_MEDIA_GALLERIES_WIN_MTP_DEVICE_DELEGATE_IMPL_WIN_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_MEDIA_GALLERIES_WIN_MTP_DEVICE_DELEGATE_IMPL_WIN_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <queue> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/scoped_comptr.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SequencedTaskRunner; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SnapshotFileDetails; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct SnapshotRequestInfo; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// MTPDeviceDelegateImplWin is used to communicate with the media transfer 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// protocol (MTP) device to complete file system operations. These operations 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// are performed asynchronously on a blocking pool thread since the device 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// access may be slow and may take a long time to complete. MTP 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// device can have multiple data storage partitions. MTPDeviceDelegateImplWin 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is instantiated per MTP device storage partition using 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CreateMTPDeviceAsyncDelegate(). MTPDeviceDelegateImplWin lives on the IO 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// thread. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MTPDeviceDelegateImplWin : public MTPDeviceAsyncDelegate { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Structure used to represent MTP device storage partition details. 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct StorageDeviceInfo { 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StorageDeviceInfo(const base::string16& pnp_device_id, 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& registered_device_path, 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& storage_object_id); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The PnP Device Id, used to open the device for communication, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // e.g. "\\?\usb#vid_04a9&pid_3073#12#{6ac27878-a6fa-4155-ba85-f1d4f33}". 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 pnp_device_id; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The media file system root path, which is obtained during the 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // registration of MTP device storage partition as a file system, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // e.g. "\\MTP:StorageSerial:SID-{10001,E,9823}:237483". 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 registered_device_path; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The MTP device storage partition object identifier, used to enumerate the 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // storage contents, e.g. "s10001". 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 storage_object_id; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend void OnGetStorageInfoCreateDelegate( 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& device_location, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CreateMTPDeviceAsyncDelegateCallback& callback, 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16* pnp_device_id, 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16* storage_object_id, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool succeeded); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum InitializationState { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UNINITIALIZED = 0, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PENDING_INIT, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INITIALIZED 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to represent pending task details. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct PendingTaskInfo { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingTaskInfo(const tracked_objects::Location& location, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<base::File::Error(void)>& task, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(base::File::Error)>& reply); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location location; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<base::File::Error(void)> task; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(base::File::Error)> reply; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Defers the device initializations until the first file operation request. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do all the initializations in EnsureInitAndRunTask() function. 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MTPDeviceDelegateImplWin(const base::string16& registered_device_path, 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& pnp_device_id, 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& storage_object_id); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destructed via CancelPendingTasksAndDeleteDelegate(). 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MTPDeviceDelegateImplWin(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // MTPDeviceAsyncDelegate: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetFileInfo( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GetFileInfoSuccessCallback& success_callback, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ReadDirectory( 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& root, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ReadDirectorySuccessCallback& success_callback, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CreateSnapshotFile( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& device_file_path, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& local_path, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CreateSnapshotFileSuccessCallback& success_callback, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE; 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool IsStreaming() OVERRIDE; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ReadBytes(const base::FilePath& device_file_path, 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<net::IOBuffer>& buf, 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 offset, 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int buf_len, 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ReadBytesSuccessCallback& success_callback, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ErrorCallback& error_callback) OVERRIDE; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelPendingTasksAndDeleteDelegate() OVERRIDE; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensures the device is initialized for communication by doing a 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // call-and-reply to a blocking pool thread. |task_info.task| runs on a 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // blocking pool thread and |task_info.reply| runs on the IO thread. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the device is already initialized, post the |task_info.task| 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // immediately on a blocking pool thread. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the device is uninitialized, store the |task_info| in a pending task 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // list and then runs all the pending tasks once the device is successfully 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // initialized. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EnsureInitAndRunTask(const PendingTaskInfo& task_info); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Writes data chunk from the device to the snapshot file path based on the 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // parameters in |current_snapshot_details_| by doing a call-and-reply to a 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // blocking pool thread. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WriteDataChunkIntoSnapshotFile(); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Processes the next pending request. 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ProcessNextPendingRequest(); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handles the event that the device is initialized. |succeeded| indicates 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // whether device initialization succeeded or not. If the device is 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // successfully initialized, runs the next pending task. 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnInitCompleted(bool succeeded); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when GetFileInfo() completes. |file_info| specifies the requested 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // file details. |error| specifies the platform file error code. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the GetFileInfo() succeeds, |success_callback| is invoked to notify the 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // caller about the |file_info| details. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the GetFileInfo() fails, |file_info| is not set and |error_callback| is 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // invoked to notify the caller about the platform file |error|. 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetFileInfo(const GetFileInfoSuccessCallback& success_callback, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback, 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info* file_info, 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when ReadDirectory() completes. |file_list| contains the directory 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // file entries information. |error| specifies the platform file error code. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the ReadDirectory() succeeds, |success_callback| is invoked to notify 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the caller about the directory file entries. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the ReadDirectory() fails, |file_list| is not set and |error_callback| 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is invoked to notify the caller about the platform file |error|. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDidReadDirectory(const ReadDirectorySuccessCallback& success_callback, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback, 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::AsyncFileUtil::EntryList* file_list, 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when the get file stream request completes. 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |file_details.request_info| contains the CreateSnapshot request param 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // details. |error| specifies the platform file error code. 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the file stream of the device file is successfully 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fetched, |file_details| will contain the required details for the creation 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of the snapshot file. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the get file stream request fails, |error| is set accordingly. 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetFileStream(scoped_ptr<SnapshotFileDetails> file_details, 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when WriteDataChunkIntoSnapshotFile() completes. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |bytes_written| specifies the number of bytes written into the 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |snapshot_file_path| during the last write operation. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the write operation succeeds, |bytes_written| is set to a non-zero 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value. 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the write operation fails, |bytes_written| is set to zero. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnWroteDataChunkIntoSnapshotFile( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& snapshot_file_path, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD bytes_written); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Portable device initialization state. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializationState init_state_; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The task runner where the device operation tasks runs. 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> media_task_runner_; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Device storage partition details 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (e.g. device path, PnP device id and storage object id). 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StorageDeviceInfo storage_device_info_; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to track the current state of the snapshot file (e.g how many bytes 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // written to the snapshot file, optimal data transfer size, source file 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // stream, etc). 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A snapshot file is created incrementally. CreateSnapshotFile request reads 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and writes the snapshot file data in chunks. In order to retain the order 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of the snapshot file requests, make sure there is only one active snapshot 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // file request at any time. 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SnapshotFileDetails> current_snapshot_details_; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A list of pending tasks that needs to be run when the device is 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // initialized or when the current task in progress is complete. 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::queue<PendingTaskInfo> pending_tasks_; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to make sure only one task is in progress at any time. 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool task_in_progress_; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For callbacks that may run after destruction. 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<MTPDeviceDelegateImplWin> weak_ptr_factory_; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MTPDeviceDelegateImplWin); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_MEDIA_GALLERIES_WIN_MTP_DEVICE_DELEGATE_IMPL_WIN_H_ 224