blob: 86e6bffbed3726d377b87e1e3a42cd67b28a387a [file] [log] [blame]
// Copyright 2015 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 STORAGE_BROWSER_BLOB_BLOB_STORAGE_REGISTRY_H_
#define STORAGE_BROWSER_BLOB_BLOB_STORAGE_REGISTRY_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include "base/callback_forward.h"
#include "base/component_export.h"
#include "base/macros.h"
#include "base/unguessable_token.h"
#include "storage/common/blob_storage/blob_storage_constants.h"
class GURL;
namespace storage {
class BlobEntry;
// This class stores the blob data in the various states of construction, as
// well as URL mappings to blob uuids.
// Implementation notes:
// * When removing a uuid registration, we do not check for URL mappings to that
// uuid. The user must keep track of these.
class COMPONENT_EXPORT(STORAGE_BROWSER) BlobStorageRegistry {
public:
BlobStorageRegistry();
~BlobStorageRegistry();
// Creates the blob entry with a refcount of 1 and a state of PENDING. If
// the blob is already in use, we return null.
BlobEntry* CreateEntry(const std::string& uuid,
const std::string& content_type,
const std::string& content_disposition);
// Removes the blob entry with the given uuid. This does not unmap any
// URLs that are pointing to this uuid. Returns if the entry existed.
bool DeleteEntry(const std::string& uuid);
bool HasEntry(const std::string& uuid) const;
// Gets the blob entry for the given uuid. Returns nullptr if the entry
// does not exist.
BlobEntry* GetEntry(const std::string& uuid);
const BlobEntry* GetEntry(const std::string& uuid) const;
// Creates a url mapping from blob uuid to the given url. Returns false if
// the uuid isn't mapped to an entry or if there already is a map for the URL.
bool CreateUrlMapping(const GURL& url, const std::string& uuid);
// Removes the given URL mapping. Optionally populates a uuid string of the
// removed entry uuid. Returns false if the url isn't mapped.
bool DeleteURLMapping(const GURL& url, std::string* uuid);
// Returns if the url is mapped to a blob uuid.
bool IsURLMapped(const GURL& blob_url) const;
// Returns the entry from the given url, and optionally populates the uuid for
// that entry. Returns a nullptr if the mapping or entry doesn't exist.
BlobEntry* GetEntryFromURL(const GURL& url, std::string* uuid);
size_t blob_count() const { return blob_map_.size(); }
size_t url_count() const { return url_to_uuid_.size(); }
void AddTokenMapping(const base::UnguessableToken& token,
const GURL& url,
const std::string& uuid);
void RemoveTokenMapping(const base::UnguessableToken& token);
bool GetTokenMapping(const base::UnguessableToken& token,
GURL* url,
std::string* uuid) const;
private:
friend class ViewBlobInternalsJob;
std::unordered_map<std::string, std::unique_ptr<BlobEntry>> blob_map_;
std::map<GURL, std::string> url_to_uuid_;
std::map<base::UnguessableToken, std::pair<GURL, std::string>>
token_to_url_and_uuid_;
DISALLOW_COPY_AND_ASSIGN(BlobStorageRegistry);
};
} // namespace storage
#endif // STORAGE_BROWSER_BLOB_BLOB_STORAGE_REGISTRY_H_