10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2014 The Chromium Authors. All rights reserved.
20ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Use of this source code is governed by a BSD-style license that can be
30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// found in the LICENSE file.
40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "content/browser/fileapi/blob_storage_host.h"
60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "base/sequenced_task_runner.h"
80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "base/strings/string_util.h"
90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "storage/browser/blob/blob_data_handle.h"
100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "storage/browser/blob/blob_storage_context.h"
110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "url/gurl.h"
120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing storage::BlobStorageContext;
140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing storage::BlobData;
150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace content {
170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongBlobStorageHost::BlobStorageHost(BlobStorageContext* context)
190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    : context_(context->AsWeakPtr()) {
200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongBlobStorageHost::~BlobStorageHost() {
230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get())
240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return;
250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  for (std::set<GURL>::iterator iter = public_blob_urls_.begin();
260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong       iter != public_blob_urls_.end(); ++iter) {
270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    context_->RevokePublicBlobURL(*iter);
280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  }
290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  for (BlobReferenceMap::iterator iter = blobs_inuse_map_.begin();
300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong       iter != blobs_inuse_map_.end(); ++iter) {
310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    for (int i = 0; i < iter->second; ++i)
320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong      context_->DecrementBlobRefCount(iter->first);
330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  }
340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
351d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::StartBuildingBlob(const std::string& uuid) {
370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || uuid.empty() || context_->IsInUse(uuid))
381d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    return false;
391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  context_->StartBuildingBlob(uuid);
400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  blobs_inuse_map_[uuid] = 1;
410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return true;
420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::AppendBlobDataItem(
450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    const std::string& uuid, const BlobData::Item& data_item) {
460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || !IsBeingBuiltInHost(uuid))
470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return false;
480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  context_->AppendBlobDataItem(uuid, data_item);
490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return true;
500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::CancelBuildingBlob(const std::string& uuid) {
530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || !IsBeingBuiltInHost(uuid))
540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return false;
550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  blobs_inuse_map_.erase(uuid);
560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  context_->CancelBuildingBlob(uuid);
570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return true;
580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::FinishBuildingBlob(
610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    const std::string& uuid, const std::string& content_type) {
620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || !IsBeingBuiltInHost(uuid))
630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return false;
6479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  context_->FinishBuildingBlob(uuid, content_type);
6579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  return true;
660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::IncrementBlobRefCount(const std::string& uuid) {
690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || !context_->IsInUse(uuid) ||
7079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez      context_->IsBeingBuilt(uuid))
710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return false;
720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  context_->IncrementBlobRefCount(uuid);
730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  blobs_inuse_map_[uuid] += 1;
740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return true;
750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::DecrementBlobRefCount(const std::string& uuid) {
780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || !IsInUseInHost(uuid))
790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return false;
800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  context_->DecrementBlobRefCount(uuid);
810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  blobs_inuse_map_[uuid] -= 1;
820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (blobs_inuse_map_[uuid] == 0)
830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    blobs_inuse_map_.erase(uuid);
840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return true;
850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::RegisterPublicBlobURL(
880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    const GURL& blob_url, const std::string& uuid) {
890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || !IsInUseInHost(uuid) ||
900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong      context_->IsUrlRegistered(blob_url))
910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return false;
920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  context_->RegisterPublicBlobURL(blob_url, uuid);
930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  public_blob_urls_.insert(blob_url);
940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return true;
950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::RevokePublicBlobURL(const GURL& blob_url) {
980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  if (!context_.get() || !IsUrlRegisteredInHost(blob_url))
990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    return false;
1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  context_->RevokePublicBlobURL(blob_url);
1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  public_blob_urls_.erase(blob_url);
1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return true;
1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::IsInUseInHost(const std::string& uuid) {
1060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return blobs_inuse_map_.find(uuid) != blobs_inuse_map_.end();
1070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
1080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::IsBeingBuiltInHost(const std::string& uuid) {
1100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return IsInUseInHost(uuid) && context_->IsBeingBuilt(uuid);
1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BlobStorageHost::IsUrlRegisteredInHost(const GURL& blob_url) {
1140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  return public_blob_urls_.find(blob_url) != public_blob_urls_.end();
1150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}
1160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}  // namespace content
1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong