1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_OPERATION_MANAGER_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_OPERATION_MANAGER_H_ 7 8 #include <map> 9 #include <string> 10 #include "base/bind.h" 11 #include "base/callback.h" 12 #include "base/memory/weak_ptr.h" 13 #include "base/scoped_observer.h" 14 #include "base/stl_util.h" 15 #include "base/timer/timer.h" 16 #include "chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h" 17 #include "chrome/browser/extensions/api/image_writer_private/operation.h" 18 #include "chrome/common/extensions/api/image_writer_private.h" 19 #include "content/public/browser/notification_observer.h" 20 #include "content/public/browser/notification_registrar.h" 21 #include "extensions/browser/browser_context_keyed_api_factory.h" 22 #include "extensions/browser/extension_registry_observer.h" 23 #include "url/gurl.h" 24 25 namespace image_writer_api = extensions::api::image_writer_private; 26 27 class Profile; 28 29 namespace content { 30 class BrowserContext; 31 } 32 33 namespace extensions { 34 class ExtensionRegistry; 35 36 namespace image_writer { 37 38 class Operation; 39 40 // Manages image writer operations for the current profile. Including clean-up 41 // and message routing. 42 class OperationManager : public BrowserContextKeyedAPI, 43 public content::NotificationObserver, 44 public extensions::ExtensionRegistryObserver, 45 public base::SupportsWeakPtr<OperationManager> { 46 public: 47 typedef std::string ExtensionId; 48 49 explicit OperationManager(content::BrowserContext* context); 50 virtual ~OperationManager(); 51 52 virtual void Shutdown() OVERRIDE; 53 54 // Starts a WriteFromUrl operation. 55 void StartWriteFromUrl(const ExtensionId& extension_id, 56 GURL url, 57 const std::string& hash, 58 const std::string& device_path, 59 const Operation::StartWriteCallback& callback); 60 61 // Starts a WriteFromFile operation. 62 void StartWriteFromFile(const ExtensionId& extension_id, 63 const base::FilePath& path, 64 const std::string& device_path, 65 const Operation::StartWriteCallback& callback); 66 67 // Cancels the extensions current operation if any. 68 void CancelWrite(const ExtensionId& extension_id, 69 const Operation::CancelWriteCallback& callback); 70 71 // Starts a write that removes the partition table. 72 void DestroyPartitions(const ExtensionId& extension_id, 73 const std::string& device_path, 74 const Operation::StartWriteCallback& callback); 75 76 // Callback for progress events. 77 virtual void OnProgress(const ExtensionId& extension_id, 78 image_writer_api::Stage stage, 79 int progress); 80 // Callback for completion events. 81 virtual void OnComplete(const ExtensionId& extension_id); 82 83 // Callback for error events. 84 virtual void OnError(const ExtensionId& extension_id, 85 image_writer_api::Stage stage, 86 int progress, 87 const std::string& error_message); 88 89 // BrowserContextKeyedAPI 90 static BrowserContextKeyedAPIFactory<OperationManager>* GetFactoryInstance(); 91 static OperationManager* Get(content::BrowserContext* context); 92 93 private: 94 95 static const char* service_name() { 96 return "OperationManager"; 97 } 98 99 // NotificationObserver implementation. 100 virtual void Observe(int type, 101 const content::NotificationSource& source, 102 const content::NotificationDetails& details) OVERRIDE; 103 104 // ExtensionRegistryObserver implementation. 105 virtual void OnExtensionUnloaded( 106 content::BrowserContext* browser_context, 107 const Extension* extension, 108 UnloadedExtensionInfo::Reason reason) OVERRIDE; 109 110 Operation* GetOperation(const ExtensionId& extension_id); 111 void DeleteOperation(const ExtensionId& extension_id); 112 113 friend class BrowserContextKeyedAPIFactory<OperationManager>; 114 typedef std::map<ExtensionId, scoped_refptr<Operation> > OperationMap; 115 116 content::BrowserContext* browser_context_; 117 OperationMap operations_; 118 content::NotificationRegistrar registrar_; 119 120 // Listen to extension unloaded notification. 121 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 122 extension_registry_observer_; 123 124 base::WeakPtrFactory<OperationManager> weak_factory_; 125 126 DISALLOW_COPY_AND_ASSIGN(OperationManager); 127 }; 128 129 } // namespace image_writer 130 } // namespace extensions 131 132 #endif // CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_OPERATION_MANAGER_H_ 133