// Copyright 2016 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_URL_REGISTRY_H_
#define COBALT_DOM_URL_REGISTRY_H_

#include <string>

#include "base/hash_tables.h"
#include "base/memory/ref_counted.h"

namespace cobalt {
namespace dom {

// This class manages a registry of objects.  Its user can associate a
// object to a blob url as well as to retrieve a object by a blob url.
// This is because to assign a object to the src of an HTMLMediaElement
// (when the object is MediaSource) or to another kind of element or CSS
// property (when the object is a Blob), we have to first convert the
// object into a blob url by calling URL.createObjectURL(). And eventually
// the element or property has to retrieve the object from the blob url.
// Note: It is unsafe to directly encode the pointer to the object in the
// url as the url is assigned from JavaScript.
template <typename ObjectType>
class UrlRegistry {
 public:
  void Register(const std::string& blob_url,
                const scoped_refptr<ObjectType>& object);
  scoped_refptr<ObjectType> Retrieve(const std::string& blob_url);
  bool Unregister(const std::string& blob_url);

 private:
  typedef base::hash_map<std::string, scoped_refptr<ObjectType> > UrlMap;
  UrlMap object_registry_;
};

template <typename ObjectType>
void UrlRegistry<ObjectType>::Register(
    const std::string& blob_url, const scoped_refptr<ObjectType>& object) {
  DCHECK(object);
  DCHECK(object_registry_.find(blob_url) == object_registry_.end());
  object_registry_.insert(std::make_pair(blob_url, object));
}

template <typename ObjectType>
scoped_refptr<ObjectType> UrlRegistry<ObjectType>::Retrieve(
    const std::string& blob_url) {
  typename UrlMap::iterator iter = object_registry_.find(blob_url);
  if (iter == object_registry_.end()) {
    DLOG(WARNING) << "Cannot find object for blob url " << blob_url;
    return NULL;
  }

  return iter->second;
}

template <typename ObjectType>
bool UrlRegistry<ObjectType>::Unregister(const std::string& blob_url) {
  typename UrlMap::iterator iter = object_registry_.find(blob_url);
  if (iter == object_registry_.end()) {
    return false;
  }

  object_registry_.erase(iter);
  return true;
}

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_URL_REGISTRY_H_
