// 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. #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_DOWNLOAD_HANDLER_H_ #define CHROME_BROWSER_CHROMEOS_DRIVE_DOWNLOAD_HANDLER_H_ #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/chromeos/drive/file_errors.h" #include "chrome/browser/download/all_download_item_notifier.h" #include "content/public/browser/download_manager_delegate.h" class Profile; namespace content { class DownloadItem; class DownloadManager; } namespace drive { class FileSystemInterface; class ResourceEntry; // Observes downloads to temporary local drive folder. Schedules these // downloads for upload to drive service. class DownloadHandler : public AllDownloadItemNotifier::Observer { public: explicit DownloadHandler(FileSystemInterface* file_system); virtual ~DownloadHandler(); // Utility method to get DownloadHandler with profile. static DownloadHandler* GetForProfile(Profile* profile); // Become an observer of DownloadManager. void Initialize(content::DownloadManager* download_manager, const base::FilePath& drive_tmp_download_path); // Callback used to return results from SubstituteDriveDownloadPath. // TODO(hashimoto): Report error with a FileError. crbug.com/171345 typedef base::Callback SubstituteDriveDownloadPathCallback; void SubstituteDriveDownloadPath( const base::FilePath& drive_path, content::DownloadItem* download, const SubstituteDriveDownloadPathCallback& callback); // Sets drive path, for example, '/special/drive/MyFolder/MyFile', // to external data in |download|. Also sets display name and // makes |download| a temporary. void SetDownloadParams(const base::FilePath& drive_path, content::DownloadItem* download); // Gets the target drive path from external data in |download|. base::FilePath GetTargetPath(const content::DownloadItem* download); // Gets the downloaded drive cache file path from external data in |download|. base::FilePath GetCacheFilePath(const content::DownloadItem* download); // Checks if there is a Drive upload associated with |download| bool IsDriveDownload(const content::DownloadItem* download); // Checks a file corresponding to the download item exists in Drive. void CheckForFileExistence( const content::DownloadItem* download, const content::CheckForFileExistenceCallback& callback); private: // AllDownloadItemNotifier::Observer overrides: virtual void OnDownloadCreated(content::DownloadManager* manager, content::DownloadItem* download) OVERRIDE; virtual void OnDownloadUpdated(content::DownloadManager* manager, content::DownloadItem* download) OVERRIDE; // Removes the download. void RemoveDownload(int id); // Callback for FileSystem::CreateDirectory(). // Used to implement SubstituteDriveDownloadPath(). void OnCreateDirectory(const SubstituteDriveDownloadPathCallback& callback, FileError error); // Starts the upload of a downloaded/downloading file. void UploadDownloadItem(content::DownloadItem* download); // Sets |cache_file_path| as user data of the download item specified by |id|. void SetCacheFilePath(int id, const base::FilePath* cache_file_path, FileError error); FileSystemInterface* file_system_; // Owned by DriveIntegrationService. // Observe the DownloadManager for new downloads. scoped_ptr notifier_; // Temporary download location directory. base::FilePath drive_tmp_download_path_; // Note: This should remain the last member so it'll be destroyed and // invalidate its weak pointers before any other members are destroyed. base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(DownloadHandler); }; } // namespace drive #endif // CHROME_BROWSER_CHROMEOS_DRIVE_DOWNLOAD_HANDLER_H_