blob: bbfc10cdf522677ba836498c4c9b3e92e8210c98 [file] [log] [blame]
// Copyright 2014 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_MEDIA_GALLERIES_MEDIA_SCAN_MANAGER_H_
#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_SCAN_MANAGER_H_
#include <map>
#include <set>
#include <string>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observer.h"
#include "base/time/time.h"
#include "chrome/browser/media_galleries/media_folder_finder.h"
#include "chrome/browser/media_galleries/media_scan_types.h"
#include "extensions/browser/extension_registry_observer.h"
class MediaScanManagerObserver;
class Profile;
namespace extensions {
class Extension;
class ExtensionRegistry;
}
// The MediaScanManager is owned by MediaFileSystemRegistry, which is global.
// This class manages multiple 'virtual' media scans, up to one per extension
// per profile, and also manages the one physical scan backing them.
// This class lives and is called on the UI thread.
class MediaScanManager : public extensions::ExtensionRegistryObserver {
public:
MediaScanManager();
~MediaScanManager() override;
// There can only be ever one observer registered per profile. Does not take
// ownership of |observer|. An observer must be registered before scanning.
void AddObserver(Profile* profile, MediaScanManagerObserver* observer);
void RemoveObserver(Profile* profile);
// Must be called when |profile| is shut down.
void CancelScansForProfile(Profile* profile);
// The results of the scan are reported to the registered
// MediaScanManagerObserver via OnScanFinished. There must be an observer
// registered for |profile| before the scan starts.
void StartScan(Profile* profile, const extensions::Extension* extension,
bool user_gesture);
void CancelScan(Profile* profile, const extensions::Extension* extension);
protected:
friend class MediaGalleriesPlatformAppBrowserTest;
friend class MediaScanManagerTest;
typedef base::Callback<MediaFolderFinder*(
const MediaFolderFinder::MediaFolderFinderResultsCallback&)>
MediaFolderFinderFactory;
void SetMediaFolderFinderFactory(const MediaFolderFinderFactory& factory);
// Here so that friend MediaScanManagerTest can access it.
static MediaFolderFinder::MediaFolderFinderResults FindContainerScanResults(
const MediaFolderFinder::MediaFolderFinderResults& found_folders,
const std::vector<base::FilePath>& sensitive_locations);
private:
struct ScanObservers {
ScanObservers();
~ScanObservers();
MediaScanManagerObserver* observer;
std::set<std::string /*extension id*/> scanning_extensions;
};
typedef std::map<Profile*, ScanObservers> ScanObserverMap;
// extensions::ExtensionRegistryObserver implementation.
void OnExtensionUnloaded(
content::BrowserContext* browser_context,
const extensions::Extension* extension,
extensions::UnloadedExtensionInfo::Reason reason) override;
bool ScanInProgress() const;
void OnScanCompleted(
bool success,
const MediaFolderFinder::MediaFolderFinderResults& found_folders);
void OnFoundContainerDirectories(
const MediaFolderFinder::MediaFolderFinderResults& found_folders,
const MediaFolderFinder::MediaFolderFinderResults& container_folders);
scoped_ptr<MediaFolderFinder> folder_finder_;
base::Time scan_start_time_;
// If not NULL, used to create |folder_finder_|. Used for testing.
MediaFolderFinderFactory testing_folder_finder_factory_;
// Set of extensions (on all profiles) that have an in-progress scan.
ScanObserverMap observers_;
ScopedObserver<extensions::ExtensionRegistry,
extensions::ExtensionRegistryObserver>
scoped_extension_registry_observer_;
base::WeakPtrFactory<MediaScanManager> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(MediaScanManager);
};
#endif // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_SCAN_MANAGER_H_