blob: 020d6bc7af7787ac60bff12b3bbb776def2e50d0 [file] [log] [blame]
// 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.
// GalleryWatchStateTracker tracks the gallery watchers, updates the
// extension state storage and observes the notification events.
// GalleryWatchStateTracker lives on the UI thread.
#ifndef CHROME_BROWSER_EXTENSIONS_API_MEDIA_GALLERIES_PRIVATE_GALLERY_WATCH_STATE_TRACKER_H_
#define CHROME_BROWSER_EXTENSIONS_API_MEDIA_GALLERIES_PRIVATE_GALLERY_WATCH_STATE_TRACKER_H_
#include <map>
#include <set>
#include <string>
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/media_galleries/media_galleries_preferences.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
class Profile;
namespace base {
class Value;
}
namespace extensions {
// This class is owned by the MediaGalleriesPrivateAPI, and is created on demand
// along with the MediaGalleriesPrivateEventRouter.
class GalleryWatchStateTracker
: public content::NotificationObserver,
public base::SupportsWeakPtr<GalleryWatchStateTracker>,
public MediaGalleriesPreferences::GalleryChangeObserver {
public:
explicit GalleryWatchStateTracker(Profile* profile);
virtual ~GalleryWatchStateTracker();
// Returns the GalleryWatchStateTracker associated with the |profile|.
// Returns NULL if GalleryWatchStateTracker does not exists.
static GalleryWatchStateTracker* GetForProfile(Profile* profile);
// Updates the storage for the given extension on the receipt of gallery
// watch added event.
void OnGalleryWatchAdded(const std::string& extension_id,
MediaGalleryPrefId gallery_id);
// Updates the storage for the given extension on the receipt of gallery
// watch removed event.
void OnGalleryWatchRemoved(const std::string& extension_id,
MediaGalleryPrefId gallery_id);
// Updates the state of the gallery watchers on the receipt of access
// permission changed event for the extension specified by the
// |extension_id|.
virtual void OnPermissionAdded(MediaGalleriesPreferences* pref,
const std::string& extension_id,
MediaGalleryPrefId gallery_id) OVERRIDE;
virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref,
const std::string& extension_id,
MediaGalleryPrefId gallery_id) OVERRIDE;
virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref,
MediaGalleryPrefId gallery_id) OVERRIDE;
// Returns a set of watched gallery identifiers for the extension specified
// by the |extension_id|.
MediaGalleryPrefIdSet GetAllWatchedGalleryIDsForExtension(
const std::string& extension_id) const;
// Removes all the gallery watchers associated with the extension specified
// by the |extension_id|.
void RemoveAllGalleryWatchersForExtension(
const std::string& extension_id,
MediaGalleriesPreferences* preferences);
private:
// Key: Gallery identifier.
// Value: True if the watcher is active. Watcher will be active only if
// the extension has access permission to the watched gallery and a watcher
// has been successfully setup.
typedef std::map<MediaGalleryPrefId, bool> WatchedGalleriesMap;
// Key: Extension identifier.
// Value: Map of watched gallery information.
typedef std::map<std::string, WatchedGalleriesMap> WatchedExtensionsMap;
// content::NotificationObserver implementation.
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// Syncs media gallery watch data for the given extension to/from the state
// storage.
void WriteToStorage(const std::string& extension_id);
void ReadFromStorage(const std::string& extension_id,
scoped_ptr<base::Value> value);
// Sets up the gallery watcher on the receipt of granted gallery permission
// event.
void SetupGalleryWatch(const std::string& extension_id,
MediaGalleryPrefId gallery_id,
MediaGalleriesPreferences* preferences);
// Removes the gallery watcher on the receipt of revoked gallery permission
// event.
void RemoveGalleryWatch(const std::string& extension_id,
MediaGalleryPrefId gallery_id,
MediaGalleriesPreferences* preferences);
// Returns true if a gallery watcher exists for the extension.
// Set |has_active_watcher| to true to find if the gallery watcher is active.
bool HasGalleryWatchInfo(const std::string& extension_id,
MediaGalleryPrefId gallery_id,
bool has_active_watcher);
// Handles the setup gallery watch request response. When an extension is
// loaded, GalleryWatchStateTracker reads the storage and sends request to
// setup gallery watchers for the known watch paths.
void HandleSetupGalleryWatchResponse(const std::string& extension_id,
MediaGalleryPrefId gallery_id,
bool success);
// Adds the watched |gallery_id| in |watched_extensions_map_| for the
// extension specified by the |extension_id|. Returns true if the |gallery_id|
// is added into the |watched_extensions_map_| and returns false if the
// |gallery_id| already exists in the |watched_extensions_map_|.
bool AddWatchedGalleryIdInfoForExtension(const std::string& extension_id,
MediaGalleryPrefId gallery_id);
// Current profile.
Profile* profile_;
// Used to listen for NOTIFICATION_EXTENSION_LOADED and
// NOTIFICATION_EXTENSION_UNLOADED events.
content::NotificationRegistrar registrar_;
// A map of watched gallery details, per extension.
WatchedExtensionsMap watched_extensions_map_;
DISALLOW_COPY_AND_ASSIGN(GalleryWatchStateTracker);
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_MEDIA_GALLERIES_PRIVATE_GALLERY_WATCH_STATE_TRACKER_H_