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