/*
 * 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_BASE_EVENT_DISPATCHER_H_
#define COBALT_BASE_EVENT_DISPATCHER_H_

#include <vector>

#include "base/callback.h"
#include "base/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "base/synchronization/lock.h"
#include "cobalt/base/event.h"

namespace base {

typedef Callback<void(const Event*)> EventCallback;

// A base class for sending events to a set of registered listeners.
// Event producers will call DispatchEvent and each callback will be called.
// The recipient of the callback is responsible for re-posting to an appropriate
// message loop. No other work should be done on the thread that receives
// the callback.
class EventDispatcher {
 public:
  ~EventDispatcher();
  // Send the event to all callers registered for this type of event.
  // May be called from any thread.
  void DispatchEvent(scoped_ptr<Event> event) const;

  // Register a callback to be notified about Events of the given type.
  // May be called from any thread.
  void AddEventCallback(TypeId type, const EventCallback& cb);

  // De-register the given callback from subsequent notifications.
  // May be called from any thread.
  void RemoveEventCallback(TypeId type, const EventCallback& cb);

 private:
  typedef hash_map<TypeId, std::vector<EventCallback> > CallbackMap;
  CallbackMap event_callbacks_;
  // Lock to protect access to the callback map.
  mutable base::Lock lock_;
};

}  // namespace base

#endif  // COBALT_BASE_EVENT_DISPATCHER_H_
