1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#ifndef CONTENT_BROWSER_FILEAPI_STORAGE_HOST_H_ 6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define CONTENT_BROWSER_FILEAPI_STORAGE_HOST_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set> 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h" 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/common/content_export.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/blob_data.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GURL; 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BlobDataHandle; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BlobStorageHost; 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BlobStorageContext; 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::BlobStorageContext; 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::BlobData; 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace content { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class handles the logistics of blob storage for a single child process. 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// There is one instance per child process. When the child process 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// terminates all blob references attibutable to that process go away upon 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// destruction of the instance. The class is single threaded and should 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// only be used on the IO thread. 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass CONTENT_EXPORT BlobStorageHost { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit BlobStorageHost(BlobStorageContext* context); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~BlobStorageHost(); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Methods to support the IPC message protocol. 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A false return indicates a problem with the inputs 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // like a non-existent or pre-existent uuid or url. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool StartBuildingBlob(const std::string& uuid) WARN_UNUSED_RESULT; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool AppendBlobDataItem(const std::string& uuid, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BlobData::Item& data_item) WARN_UNUSED_RESULT; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool CancelBuildingBlob(const std::string& uuid) WARN_UNUSED_RESULT; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool FinishBuildingBlob(const std::string& uuid, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& type) WARN_UNUSED_RESULT; 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool IncrementBlobRefCount(const std::string& uuid) WARN_UNUSED_RESULT; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool DecrementBlobRefCount(const std::string& uuid) WARN_UNUSED_RESULT; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool RegisterPublicBlobURL(const GURL& blob_url, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& uuid) WARN_UNUSED_RESULT; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool RevokePublicBlobURL(const GURL& blob_url) WARN_UNUSED_RESULT; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::map<std::string, int> BlobReferenceMap; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool IsInUseInHost(const std::string& uuid); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool IsBeingBuiltInHost(const std::string& uuid); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool IsUrlRegisteredInHost(const GURL& blob_url); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Collection of blob ids and a count of how many usages 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of that id are attributable to this consumer. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BlobReferenceMap blobs_inuse_map_; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The set of public blob urls coined by this consumer. 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<GURL> public_blob_urls_; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtr<BlobStorageContext> context_; 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BlobStorageHost); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace content 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif // CONTENT_BROWSER_FILEAPI_STORAGE_HOST_H_ 77