Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / browser / fileapi / blob_storage_host.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/fileapi/blob_storage_host.h"
6
7 #include "base/sequenced_task_runner.h"
8 #include "base/strings/string_util.h"
9 #include "url/gurl.h"
10 #include "webkit/browser/blob/blob_data_handle.h"
11 #include "webkit/browser/blob/blob_storage_context.h"
12
13 using webkit_blob::BlobStorageContext;
14 using webkit_blob::BlobData;
15
16 namespace content {
17
18 BlobStorageHost::BlobStorageHost(BlobStorageContext* context)
19     : context_(context->AsWeakPtr()) {
20 }
21
22 BlobStorageHost::~BlobStorageHost() {
23   if (!context_.get())
24     return;
25   for (std::set<GURL>::iterator iter = public_blob_urls_.begin();
26        iter != public_blob_urls_.end(); ++iter) {
27     context_->RevokePublicBlobURL(*iter);
28   }
29   for (BlobReferenceMap::iterator iter = blobs_inuse_map_.begin();
30        iter != blobs_inuse_map_.end(); ++iter) {
31     for (int i = 0; i < iter->second; ++i)
32       context_->DecrementBlobRefCount(iter->first);
33   }
34 }
35
36 bool BlobStorageHost::StartBuildingBlob(const std::string& uuid) {
37   if (!context_.get() || uuid.empty() || context_->IsInUse(uuid))
38     return false;
39   context_->StartBuildingBlob(uuid);
40   blobs_inuse_map_[uuid] = 1;
41   return true;
42 }
43
44 bool BlobStorageHost::AppendBlobDataItem(
45     const std::string& uuid, const BlobData::Item& data_item) {
46   if (!context_.get() || !IsBeingBuiltInHost(uuid))
47     return false;
48   context_->AppendBlobDataItem(uuid, data_item);
49   return true;
50 }
51
52 bool BlobStorageHost::CancelBuildingBlob(const std::string& uuid) {
53   if (!context_.get() || !IsBeingBuiltInHost(uuid))
54     return false;
55   blobs_inuse_map_.erase(uuid);
56   context_->CancelBuildingBlob(uuid);
57   return true;
58 }
59
60 bool BlobStorageHost::FinishBuildingBlob(
61     const std::string& uuid, const std::string& content_type) {
62   if (!context_.get() || !IsBeingBuiltInHost(uuid))
63     return false;
64   context_->FinishBuildingBlob(uuid, content_type);
65   return true;
66 }
67
68 bool BlobStorageHost::IncrementBlobRefCount(const std::string& uuid) {
69   if (!context_.get() || !context_->IsInUse(uuid) ||
70       context_->IsBeingBuilt(uuid))
71     return false;
72   context_->IncrementBlobRefCount(uuid);
73   blobs_inuse_map_[uuid] += 1;
74   return true;
75 }
76
77 bool BlobStorageHost::DecrementBlobRefCount(const std::string& uuid) {
78   if (!context_.get() || !IsInUseInHost(uuid))
79     return false;
80   context_->DecrementBlobRefCount(uuid);
81   blobs_inuse_map_[uuid] -= 1;
82   if (blobs_inuse_map_[uuid] == 0)
83     blobs_inuse_map_.erase(uuid);
84   return true;
85 }
86
87 bool BlobStorageHost::RegisterPublicBlobURL(
88     const GURL& blob_url, const std::string& uuid) {
89   if (!context_.get() || !IsInUseInHost(uuid) ||
90       context_->IsUrlRegistered(blob_url))
91     return false;
92   context_->RegisterPublicBlobURL(blob_url, uuid);
93   public_blob_urls_.insert(blob_url);
94   return true;
95 }
96
97 bool BlobStorageHost::RevokePublicBlobURL(const GURL& blob_url) {
98   if (!context_.get() || !IsUrlRegisteredInHost(blob_url))
99     return false;
100   context_->RevokePublicBlobURL(blob_url);
101   public_blob_urls_.erase(blob_url);
102   return true;
103 }
104
105 bool BlobStorageHost::IsInUseInHost(const std::string& uuid) {
106   return blobs_inuse_map_.find(uuid) != blobs_inuse_map_.end();
107 }
108
109 bool BlobStorageHost::IsBeingBuiltInHost(const std::string& uuid) {
110   return IsInUseInHost(uuid) && context_->IsBeingBuilt(uuid);
111 }
112
113 bool BlobStorageHost::IsUrlRegisteredInHost(const GURL& blob_url) {
114   return public_blob_urls_.find(blob_url) != public_blob_urls_.end();
115 }
116
117 }  // namespace content