Home | History | Annotate | Download | only in blob
      1 // Copyright (c) 2013 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 "webkit/browser/blob/blob_storage_host.h"
      6 
      7 #include "base/sequenced_task_runner.h"
      8 #include "url/gurl.h"
      9 #include "webkit/browser/blob/blob_data_handle.h"
     10 #include "webkit/browser/blob/blob_storage_context.h"
     11 
     12 namespace webkit_blob {
     13 
     14 BlobStorageHost::BlobStorageHost(BlobStorageContext* context)
     15     : context_(context->AsWeakPtr()) {
     16 }
     17 
     18 BlobStorageHost::~BlobStorageHost() {
     19   if (!context_.get())
     20     return;
     21   for (std::set<GURL>::iterator iter = public_blob_urls_.begin();
     22        iter != public_blob_urls_.end(); ++iter) {
     23     context_->RevokePublicBlobURL(*iter);
     24   }
     25   for (BlobReferenceMap::iterator iter = blobs_inuse_map_.begin();
     26        iter != blobs_inuse_map_.end(); ++iter) {
     27     for (int i = 0; i < iter->second; ++i)
     28       context_->DecrementBlobRefCount(iter->first);
     29   }
     30 }
     31 
     32 bool BlobStorageHost::StartBuildingBlob(const std::string& uuid) {
     33   if (!context_.get() || uuid.empty() || context_->IsInUse(uuid))
     34     return false;
     35   context_->StartBuildingBlob(uuid);
     36   blobs_inuse_map_[uuid] = 1;
     37   return true;
     38 }
     39 
     40 bool BlobStorageHost::AppendBlobDataItem(
     41     const std::string& uuid, const BlobData::Item& data_item) {
     42   if (!context_.get() || !IsBeingBuiltInHost(uuid))
     43     return false;
     44   context_->AppendBlobDataItem(uuid, data_item);
     45   return true;
     46 }
     47 
     48 bool BlobStorageHost::CancelBuildingBlob(const std::string& uuid) {
     49   if (!context_.get() || !IsBeingBuiltInHost(uuid))
     50     return false;
     51   blobs_inuse_map_.erase(uuid);
     52   context_->CancelBuildingBlob(uuid);
     53   return true;
     54 }
     55 
     56 bool BlobStorageHost::FinishBuildingBlob(
     57     const std::string& uuid, const std::string& content_type) {
     58   if (!context_.get() || !IsBeingBuiltInHost(uuid))
     59     return false;
     60   context_->FinishBuildingBlob(uuid, content_type);
     61   return true;
     62 }
     63 
     64 bool BlobStorageHost::IncrementBlobRefCount(const std::string& uuid) {
     65   if (!context_.get() || !context_->IsInUse(uuid) ||
     66       context_->IsBeingBuilt(uuid))
     67     return false;
     68   context_->IncrementBlobRefCount(uuid);
     69   blobs_inuse_map_[uuid] += 1;
     70   return true;
     71 }
     72 
     73 bool BlobStorageHost::DecrementBlobRefCount(const std::string& uuid) {
     74   if (!context_.get() || !IsInUseInHost(uuid))
     75     return false;
     76   context_->DecrementBlobRefCount(uuid);
     77   blobs_inuse_map_[uuid] -= 1;
     78   if (blobs_inuse_map_[uuid] == 0)
     79     blobs_inuse_map_.erase(uuid);
     80   return true;
     81 }
     82 
     83 bool BlobStorageHost::RegisterPublicBlobURL(
     84     const GURL& blob_url, const std::string& uuid) {
     85   if (!context_.get() || !IsInUseInHost(uuid) ||
     86       context_->IsUrlRegistered(blob_url))
     87     return false;
     88   context_->RegisterPublicBlobURL(blob_url, uuid);
     89   public_blob_urls_.insert(blob_url);
     90   return true;
     91 }
     92 
     93 bool BlobStorageHost::RevokePublicBlobURL(const GURL& blob_url) {
     94   if (!context_.get() || !IsUrlRegisteredInHost(blob_url))
     95     return false;
     96   context_->RevokePublicBlobURL(blob_url);
     97   public_blob_urls_.erase(blob_url);
     98   return true;
     99 }
    100 
    101 bool BlobStorageHost::IsInUseInHost(const std::string& uuid) {
    102   return blobs_inuse_map_.find(uuid) != blobs_inuse_map_.end();
    103 }
    104 
    105 bool BlobStorageHost::IsBeingBuiltInHost(const std::string& uuid) {
    106   return IsInUseInHost(uuid) && context_->IsBeingBuilt(uuid);
    107 }
    108 
    109 bool BlobStorageHost::IsUrlRegisteredInHost(const GURL& blob_url) {
    110   return public_blob_urls_.find(blob_url) != public_blob_urls_.end();
    111 }
    112 
    113 }  // namespace webkit_blob
    114