summaryrefslogtreecommitdiffstats
path: root/webkit/blob/blob_storage_controller.h
blob: a0c72b24070c2e647364bf695870ec8fdc5f0adc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright (c) 2011 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 WEBKIT_BLOB_BLOB_STORAGE_CONTROLLER_H_
#define WEBKIT_BLOB_BLOB_STORAGE_CONTROLLER_H_

#include <map>
#include <string>

#include "base/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "base/process.h"
#include "webkit/blob/blob_data.h"
#include "webkit/storage/webkit_storage_export.h"

class GURL;

namespace base {
class FilePath;
class Time;
}

namespace webkit_blob {

// This class handles the logistics of blob Storage within the browser process.
class WEBKIT_STORAGE_EXPORT BlobStorageController {
 public:
  BlobStorageController();
  ~BlobStorageController();

  void StartBuildingBlob(const GURL& url);
  void AppendBlobDataItem(const GURL& url, const BlobData::Item& data_item);
  void FinishBuildingBlob(const GURL& url, const std::string& content_type);
  void AddFinishedBlob(const GURL& url, const BlobData* blob_data);
  void CloneBlob(const GURL& url, const GURL& src_url);
  void RemoveBlob(const GURL& url);
  BlobData* GetBlobDataFromUrl(const GURL& url);

 private:
  friend class ViewBlobInternalsJob;

  typedef base::hash_map<std::string, scoped_refptr<BlobData> > BlobMap;
  typedef std::map<BlobData*, int> BlobDataUsageMap;

  void AppendStorageItems(BlobData* target_blob_data,
                          BlobData* src_blob_data,
                          uint64 offset,
                          uint64 length);
  void AppendFileItem(BlobData* target_blob_data,
                      const base::FilePath& file_path, uint64 offset,
                      uint64 length,
                      const base::Time& expected_modification_time);
  void AppendFileSystemFileItem(
      BlobData* target_blob_data,
      const GURL& url, uint64 offset, uint64 length,
      const base::Time& expected_modification_time);

  bool RemoveFromMapHelper(BlobMap* map, const GURL& url);

  void IncrementBlobDataUsage(BlobData* blob_data);
  // Returns true if no longer in use.
  bool DecrementBlobDataUsage(BlobData* blob_data);

  BlobMap blob_map_;
  BlobMap unfinalized_blob_map_;

  // Used to keep track of how much memory is being utitlized for blob data,
  // we count only the items of TYPE_DATA which are held in memory and not
  // items of TYPE_FILE.
  int64 memory_usage_;

  // Multiple urls can refer to the same blob data, this map keeps track of
  // how many urls refer to a BlobData.
  BlobDataUsageMap blob_data_usage_count_;

  DISALLOW_COPY_AND_ASSIGN(BlobStorageController);
};

}  // namespace webkit_blob

#endif  // WEBKIT_BLOB_BLOB_STORAGE_CONTROLLER_H_