// 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, but not from a dispatched event.
  void AddEventCallback(TypeId type, const EventCallback& cb);

  // De-register the given callback from subsequent notifications.
  // May be called from any thread, but not from a dispatched event.
  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_
