// Copyright 2016 The Cobalt Authors. 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_WEB_URL_REGISTRY_H_
#define COBALT_WEB_URL_REGISTRY_H_

#include <string>
#include <utility>

#include "base/containers/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "cobalt/script/tracer.h"

namespace cobalt {
namespace web {

// 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 script::Traceable {
 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);

  void TraceMembers(script::Tracer* tracer) override {
    tracer->TraceValues(object_registry_);
  }

 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 web
}  // namespace cobalt

#endif  // COBALT_WEB_URL_REGISTRY_H_
