// Copyright (c) 2013 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.

#include "webkit/browser/blob/blob_data_handle.h"

#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/sequenced_task_runner.h"
#include "webkit/browser/blob/blob_storage_context.h"
#include "webkit/common/blob/blob_data.h"

namespace webkit_blob {

BlobDataHandle::BlobDataHandle(BlobData* blob_data, BlobStorageContext* context,
                               base::SequencedTaskRunner* task_runner)
    : blob_data_(blob_data),
      context_(context->AsWeakPtr()),
      io_task_runner_(task_runner) {
  // Ensures the uuid remains registered and the underlying data is not deleted.
  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
  context_->IncrementBlobRefCount(blob_data->uuid());
  blob_data_->AddRef();
}

BlobDataHandle::~BlobDataHandle() {
  if (io_task_runner_->RunsTasksOnCurrentThread()) {
    // Note: Do not test context_ or alter the blob_data_ refcount
    // on the wrong thread.
    if (context_.get())
      context_->DecrementBlobRefCount(blob_data_->uuid());
    blob_data_->Release();
    return;
  }

  io_task_runner_->PostTask(
      FROM_HERE,
      base::Bind(&DeleteHelper, context_, base::Unretained(blob_data_)));
}

BlobData* BlobDataHandle::data() const {
  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
  return blob_data_;
}

// static
void BlobDataHandle::DeleteHelper(
    base::WeakPtr<BlobStorageContext> context,
    BlobData* blob_data) {
  if (context.get())
    context->DecrementBlobRefCount(blob_data->uuid());
  blob_data->Release();
}

}  // namespace webkit_blob
