/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_DOM_STORAGE_AREA_H_
#define COBALT_DOM_STORAGE_AREA_H_

#include <string>

#include "base/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "base/optional.h"
#include "base/synchronization/waitable_event.h"

namespace cobalt {
namespace dom {
class LocalStorageDatabase;
class Storage;

// StorageArea objects will be constructed and owned by dom::Storage.
// Maintains a hash table of key/value data for a given origin, as specified
// by the Storage node.
class StorageArea {
 public:
  typedef base::hash_map<std::string, std::string> StorageMap;

  // storage_node is the DOM node that owns this storage area.
  // db_interface is either NULL for SessionStorage, or a pointer to a
  // LocalStorageDatabase for LocalStorage.
  StorageArea(Storage* storage_node, LocalStorageDatabase* db_interface);
  ~StorageArea();

  int length();
  base::optional<std::string> Key(int index);
  base::optional<std::string> GetItem(const std::string& key);
  void SetItem(const std::string& key, const std::string& value);
  void RemoveItem(const std::string& key);
  void Clear();

  bool key_exists(const std::string& key_name);
  int size_bytes() const { return size_bytes_; }
  Storage* storage_node() const { return storage_node_; }
  const std::string& identifier() const { return identifier_; }

 private:
  void Init();
  void OnInitComplete(scoped_ptr<StorageMap> data);

  scoped_ptr<StorageMap> storage_map_;

  std::string identifier_;
  base::WaitableEvent read_event_;
  Storage* storage_node_;
  int size_bytes_;
  LocalStorageDatabase* db_interface_;
  bool initialized_;

  DISALLOW_COPY_AND_ASSIGN(StorageArea);
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_STORAGE_AREA_H_
