15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CHROME_BROWSER_DRIVE_DRIVE_UPLOADER_H_ 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CHROME_BROWSER_DRIVE_DRIVE_UPLOADER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_forward.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/drive_service_interface.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath; 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass TaskRunner; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google_apis { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct UploadRangeResponse; 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace drive { 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass DriveServiceInterface; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback to be invoked once the upload has completed. 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |upload_location| will be returned when the uploading process is started but 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// terminated before the completion due to some errors. It can be used to 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// resume it. 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef base::Callback<void( 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch google_apis::GDataErrorCode error, 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& upload_location, 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileResource> resource_entry)> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UploadCompletionCallback; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DriveUploaderInterface { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef DriveServiceInterface::InitiateUploadNewFileOptions 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UploadNewFileOptions; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef DriveServiceInterface::InitiateUploadExistingFileOptions 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UploadExistingFileOptions; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DriveUploaderInterface() {} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Uploads a new file to a directory specified by |upload_location|. 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns a callback for cancelling the uploading job. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // parent_resource_id: 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resource id of the destination directory. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // local_file_path: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The path to the local file to be uploaded. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // title: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The title (file name) of the file to be uploaded. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content_type: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The content type of the file to be uploaded. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // callback: 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when an upload is done regardless of it was successful or not. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Must not be null. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // progress_callback: 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Periodically called back with the total number of bytes sent so far. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // May be null if the information is not needed. 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual google_apis::CancelCallback UploadNewFile( 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& parent_resource_id, 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::FilePath& local_file_path, 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& title, 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& content_type, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UploadNewFileOptions& options, 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const UploadCompletionCallback& callback, 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const google_apis::ProgressCallback& progress_callback) = 0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uploads an existing file (a file that already exists on Drive). 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // See comments at UploadNewFile about common parameters and the return value. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resource_id: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resource id of the existing file to be overwritten. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // etag: 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expected ETag for the destination file. If it does not match, the upload 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fails with UPLOAD_ERROR_CONFLICT. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |etag| is empty, the test is skipped. 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual google_apis::CancelCallback UploadExistingFile( 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& resource_id, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& local_file_path, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& content_type, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UploadExistingFileOptions& options, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UploadCompletionCallback& callback, 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const google_apis::ProgressCallback& progress_callback) = 0; 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Resumes the uploading process terminated before the completion. 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |upload_location| should be the one returned via UploadCompletionCallback 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // for previous invocation. |drive_file_path|, |local_file_path| and 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |content_type| must be set to the same ones for previous invocation. 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // See comments at UploadNewFile about common parameters and the return value. 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual google_apis::CancelCallback ResumeUploadFile( 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const GURL& upload_location, 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::FilePath& local_file_path, 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& content_type, 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const UploadCompletionCallback& callback, 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const google_apis::ProgressCallback& progress_callback) = 0; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DriveUploader : public DriveUploaderInterface { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DriveUploader(DriveServiceInterface* drive_service, 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<base::TaskRunner>& blocking_task_runner); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DriveUploader(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DriveUploaderInterface overrides. 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual google_apis::CancelCallback UploadNewFile( 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& parent_resource_id, 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& local_file_path, 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& title, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& content_type, 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UploadNewFileOptions& options, 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UploadCompletionCallback& callback, 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const google_apis::ProgressCallback& progress_callback) OVERRIDE; 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual google_apis::CancelCallback UploadExistingFile( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& resource_id, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& local_file_path, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& content_type, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UploadExistingFileOptions& options, 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UploadCompletionCallback& callback, 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const google_apis::ProgressCallback& progress_callback) OVERRIDE; 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual google_apis::CancelCallback ResumeUploadFile( 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const GURL& upload_location, 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::FilePath& local_file_path, 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& content_type, 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const UploadCompletionCallback& callback, 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const google_apis::ProgressCallback& progress_callback) OVERRIDE; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct UploadFileInfo; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(scoped_ptr<UploadFileInfo> upload_file_info)> 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartInitiateUploadCallback; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starts uploading a file with |upload_file_info|. 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch google_apis::CancelCallback StartUploadFile( 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UploadFileInfo> upload_file_info, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StartInitiateUploadCallback& start_initiate_upload_callback); 152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void StartUploadFileAfterGetFileSize( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UploadFileInfo> upload_file_info, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StartInitiateUploadCallback& start_initiate_upload_callback, 155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool get_file_size_result); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Starts to initiate the new file uploading. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Upon completion, OnUploadLocationReceived should be called. 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartInitiateUploadNewFile( 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& parent_resource_id, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& title, 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UploadNewFileOptions& options, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UploadFileInfo> upload_file_info); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Starts to initiate the existing file uploading. 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Upon completion, OnUploadLocationReceived should be called. 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartInitiateUploadExistingFile( 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& resource_id, 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UploadExistingFileOptions& options, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UploadFileInfo> upload_file_info); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DriveService callback for InitiateUpload. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnUploadLocationReceived(scoped_ptr<UploadFileInfo> upload_file_info, 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch google_apis::GDataErrorCode code, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& upload_location); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Starts to get the current upload status for the file uploading. 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Upon completion, OnUploadRangeResponseReceived should be called. 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void StartGetUploadStatus(scoped_ptr<UploadFileInfo> upload_file_info); 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uploads the next chunk of data from the file. 1822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void UploadNextChunk(scoped_ptr<UploadFileInfo> upload_file_info); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DriveService callback for ResumeUpload. 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnUploadRangeResponseReceived( 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UploadFileInfo> upload_file_info, 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const google_apis::UploadRangeResponse& response, 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileResource> entry); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnUploadProgress(const google_apis::ProgressCallback& callback, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 start_position, 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 total_size, 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 progress_of_chunk, 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 total_of_chunk); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle failed uploads. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UploadFailed(scoped_ptr<UploadFileInfo> upload_file_info, 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch google_apis::GDataErrorCode error); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The lifetime of this object should be guaranteed to exceed that of the 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DriveUploader instance. 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DriveServiceInterface* drive_service_; // Not owned by this class. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::TaskRunner> blocking_task_runner_; 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalidate its weak pointers before any other members are destroyed. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<DriveUploader> weak_ptr_factory_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DriveUploader); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace drive 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif // CHROME_BROWSER_DRIVE_DRIVE_UPLOADER_H_ 214