Home | History | Annotate | Download | only in fileapi
      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
    118