// Copyright 2014 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.

#ifndef CONTENT_BROWSER_FILEAPI_BLOB_STORAGE_HOST_H_
#define CONTENT_BROWSER_FILEAPI_BLOB_STORAGE_HOST_H_

#include <map>
#include <set>
#include <string>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "storage/common/data_element.h"

class GURL;

namespace storage {
class BlobDataHandle;
class BlobStorageHost;
class BlobStorageContext;
}

namespace content {

// This class handles the logistics of blob storage for a single child process.
// There is one instance per child process. When the child process
// terminates all blob references attibutable to that process go away upon
// destruction of the instance. The class is single threaded and should
// only be used on the IO thread.
class CONTENT_EXPORT BlobStorageHost {
 public:
  explicit BlobStorageHost(storage::BlobStorageContext* context);
  ~BlobStorageHost();

  // Methods to support the IPC message protocol.
  // A false return indicates a problem with the inputs
  // like a non-existent or pre-existent uuid or url.
  bool StartBuildingBlob(const std::string& uuid) WARN_UNUSED_RESULT;
  bool AppendBlobDataItem(const std::string& uuid,
                          const storage::DataElement& data_item)
      WARN_UNUSED_RESULT;
  bool CancelBuildingBlob(const std::string& uuid) WARN_UNUSED_RESULT;
  bool FinishBuildingBlob(const std::string& uuid,
                          const std::string& type) WARN_UNUSED_RESULT;
  bool IncrementBlobRefCount(const std::string& uuid) WARN_UNUSED_RESULT;
  bool DecrementBlobRefCount(const std::string& uuid) WARN_UNUSED_RESULT;
  bool RegisterPublicBlobURL(const GURL& blob_url,
                             const std::string& uuid) WARN_UNUSED_RESULT;
  bool RevokePublicBlobURL(const GURL& blob_url) WARN_UNUSED_RESULT;

 private:
  typedef std::map<std::string, int> BlobReferenceMap;

  bool IsInUseInHost(const std::string& uuid);
  bool IsBeingBuiltInHost(const std::string& uuid);
  bool IsUrlRegisteredInHost(const GURL& blob_url);

  // Collection of blob ids and a count of how many usages
  // of that id are attributable to this consumer.
  BlobReferenceMap blobs_inuse_map_;

  // The set of public blob urls coined by this consumer.
  std::set<GURL> public_blob_urls_;

  base::WeakPtr<storage::BlobStorageContext> context_;

  DISALLOW_COPY_AND_ASSIGN(BlobStorageHost);
};

}  // namespace content

#endif  // CONTENT_BROWSER_FILEAPI_BLOB_STORAGE_HOST_H_
