// Copyright (c) 2011 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_UI_WEBUI_CHROMEOS_IMAGEBURNER_UI_H_ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_IMAGEBURNER_UI_H_ #include <map> #include <string> #include <vector> #include "base/file_path.h" #include "base/file_util.h" #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "base/values.h" #include "chrome/browser/chromeos/cros/burn_library.h" #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/mount_library.h" #include "chrome/browser/download/download_item.h" #include "chrome/browser/download/download_manager.h" #include "chrome/browser/download/download_util.h" #include "chrome/browser/ui/webui/chrome_url_data_manager.h" #include "content/browser/webui/web_ui.h" #include "googleurl/src/gurl.h" #include "net/base/file_stream.h" #include "ui/base/dragdrop/download_file_interface.h" template <typename T> struct DefaultSingletonTraits; class TabContents; class ImageBurnTaskProxy; class ImageBurnDownloaderTaskProxy; class ImageBurnDownloader { public: class Listener { public: // After download starts download status updates can be followed through // DownloadItem::Observer interface. virtual void OnDownloadStarted(bool success) = 0; }; private: typedef std::multimap<GURL, Listener*> ListenerMap; public: // Returns the singleton instance. static ImageBurnDownloader* GetInstance(); // Downloads a file from the Internet. // Should be called from UI thread. void DownloadFile(const GURL& url, const FilePath& target_file, TabContents* tab_contents); // Creates file stream for a download. // Has to be called from FILE thread. void CreateFileStreamOnFileThread(const GURL& url, const FilePath& file_path, TabContents* tab_contents, ImageBurnDownloaderTaskProxy* task); // Gets called after file stream is created and starts download. void OnFileStreamCreatedOnUIThread(const GURL& url, const FilePath& file_path, TabContents* tab_contents, net::FileStream* created_file_stream); // Adds an item to list of listeners that wait for confirmation that download // has started. void AddListener(Listener* listener, const GURL& url); private: ImageBurnDownloader() {} ~ImageBurnDownloader() {} // Let listeners know if download started successfully. void DownloadStarted(bool success, const GURL& url); friend struct DefaultSingletonTraits<ImageBurnDownloader>; std::multimap<GURL, Listener*> listeners_; DISALLOW_COPY_AND_ASSIGN(ImageBurnDownloader); }; class ImageBurnResourceManager : public DownloadManager::Observer, public DownloadItem::Observer, public ImageBurnDownloader::Listener { public: class Delegate { public: virtual void OnImageDirCreated(bool success, ImageBurnTaskProxy* task) = 0; virtual void OnImageUrlCreated(GURL* image_url, bool success) = 0; }; // Returns the singleton instance. static ImageBurnResourceManager* GetInstance(); // DownloadItem::Observer interface virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE; virtual void OnDownloadOpened(DownloadItem* download) OVERRIDE {} // DownloadManager::Observer interface virtual void ModelChanged() OVERRIDE; // ImageBurnDownloader::Listener interface. virtual void OnDownloadStarted(bool success) OVERRIDE; // Creates URL image should be fetched from. // Must be called from UI thread. void CreateImageUrl(TabContents* tab_content, Delegate* delegate); // Creates directory image will be downloaded to. // Must be called from FILE thread. void CreateImageDir(Delegate* delegate, ImageBurnTaskProxy* task); // Returns directory image should be dopwnloaded to. // The directory has to be previously created. const FilePath& GetImageDir(); void ConfigFileFetched(bool fetched); bool image_download_requested() const { return image_download_requested_; } void set_image_download_requested(bool r) { image_download_requested_ = r; } bool download_started() const { return download_started_; } void set_download_started(bool s) { download_started_ = s; } bool download_finished() const { return download_finished_; } void SetDownloadFinished(bool finished); bool burn_in_progress() const { return burn_in_progress_; } void set_burn_in_progress(bool b) { burn_in_progress_ = b; } private: friend struct DefaultSingletonTraits<ImageBurnResourceManager>; ImageBurnResourceManager(); ~ImageBurnResourceManager(); FilePath image_dir_; FilePath config_file_path_; bool image_download_requested_; bool download_started_; bool download_finished_; bool burn_in_progress_; DownloadManager* download_manager_; bool download_item_observer_added_; DownloadItem* active_download_item_; scoped_ptr<GURL> image_url_; GURL config_file_url_; bool config_file_requested_; bool config_file_fetched_; std::vector<Delegate*> downloaders_; DISALLOW_COPY_AND_ASSIGN(ImageBurnResourceManager); }; class ImageBurnHandler : public WebUIMessageHandler, public chromeos::MountLibrary::Observer, public chromeos::BurnLibrary::Observer, public DownloadManager::Observer, public DownloadItem::Observer, public ImageBurnResourceManager::Delegate, public ImageBurnDownloader::Listener, public base::SupportsWeakPtr<ImageBurnHandler> { public: explicit ImageBurnHandler(TabContents* contents); virtual ~ImageBurnHandler(); // WebUIMessageHandler implementation. virtual WebUIMessageHandler* Attach(WebUI* web_ui) OVERRIDE; virtual void RegisterMessages() OVERRIDE; // chromeos::MountLibrary::Observer interface. virtual void DiskChanged(chromeos::MountLibraryEventType event, const chromeos::MountLibrary::Disk* disk) OVERRIDE; virtual void DeviceChanged(chromeos::MountLibraryEventType event, const std::string& device_path) OVERRIDE; // chromeos::BurnLibrary::Observer interface. virtual void ProgressUpdated(chromeos::BurnLibrary* object, chromeos::BurnEventType evt, const ImageBurnStatus& status) OVERRIDE; // DownloadItem::Observer interface. virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE; virtual void OnDownloadOpened(DownloadItem* download) OVERRIDE; // DownloadManager::Observer interface. virtual void ModelChanged() OVERRIDE; // ImageBurnResourceManager::Delegate interface. virtual void OnImageDirCreated(bool success, ImageBurnTaskProxy* task) OVERRIDE; virtual void OnImageUrlCreated(GURL* image_url, bool success) OVERRIDE; // ImageBurnDownloader::Listener interface. virtual void OnDownloadStarted(bool success) OVERRIDE; // Called by ImageBurnTaskProxy. void CreateImageDirOnFileThread(ImageBurnTaskProxy* task); void OnImageDirCreatedOnUIThread(bool success); void BurnImageOnFileThread(); void UnzipImageOnFileThread(ImageBurnTaskProxy* task); void UnzipComplete(bool success); private: // Callback for the "getRoots" message. void HandleGetRoots(const ListValue* args); // Callback for the "downloadImage" message. void HandleDownloadImage(const ListValue* args); // Callback for the "burnImage" message. void HandleBurnImage(const ListValue* args); // Callback for the "cancelBurnImage" message. void HandleCancelBurnImage(const ListValue* args); void DownloadCompleted(bool success); void FinalizeBurn(bool successful); void UpdateBurnProgress(int64 total_burnt, int64 image_size, const std::string& path, chromeos::BurnEventType evt); string16 GetBurnProgressText(int64 total_burnt, int64 image_size); void UnzipImage(); bool UnzipImageImpl(); // helper functions void ExtractTargetedDeviceSystemPath(const ListValue* list_value); private: FilePath zip_image_file_path_; FilePath image_file_path_; FilePath image_target_; GURL* image_download_url_; TabContents* tab_contents_; DownloadManager* download_manager_; bool download_item_observer_added_; DownloadItem* active_download_item_; ImageBurnResourceManager* resource_manager_; DISALLOW_COPY_AND_ASSIGN(ImageBurnHandler); }; class ImageBurnUI : public WebUI { public: explicit ImageBurnUI(TabContents* contents); private: DISALLOW_COPY_AND_ASSIGN(ImageBurnUI); }; #endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_IMAGEBURNER_UI_H_