Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5412)

Unified Diff: chrome/browser/chromeos/file_system_provider/file_system_plugin/plugineventrouter.cc

Issue 1093383002: [WIP] Provided file system from NACL. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Various cleanups Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/file_system_provider/file_system_plugin/plugineventrouter.cc
diff --git a/chrome/browser/chromeos/file_system_provider/file_system_plugin/plugineventrouter.cc b/chrome/browser/chromeos/file_system_provider/file_system_plugin/plugineventrouter.cc
new file mode 100644
index 0000000000000000000000000000000000000000..246f344e3f43e1abd913bb5b53289b8f07618aac
--- /dev/null
+++ b/chrome/browser/chromeos/file_system_provider/file_system_plugin/plugineventrouter.cc
@@ -0,0 +1,196 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/file_system_provider/file_system_plugin/plugineventrouter.h"
+
+#include "base/memory/singleton.h"
+#include "content/public/browser/browser_thread.h"
+#include "extensions/browser/event_router.h"
+
+using content::BrowserThread;
+using extensions::Event;
+
+namespace chromeos {
+
+PluginEventRouter::PluginEventRouter() : weak_ptr_factory_(this) {
+}
+
+PluginEventRouter::~PluginEventRouter() {
+}
+
+// Static
+PluginEventRouter* PluginEventRouter::GetInstance() {
+ return Singleton<PluginEventRouter>::get();
+}
+
+void PluginEventRouter::AddEventsListener(
+ const std::vector<std::string>& event_names,
+ PluginEventRouter::PluginEventRouterClient* plugin_ref,
+ const std::string& plugin_id) {
+ for (std::vector<std::string>::const_iterator it = event_names.begin();
+ it != event_names.end(); ++it) {
+ AddEventListener(*it, plugin_ref, plugin_id);
+ }
+}
+
+void PluginEventRouter::AddEventListener(
+ const std::string& event_name,
+ PluginEventRouter::PluginEventRouterClient* plugin_ref,
+ const std::string& plugin_id) {
+ EventListIterator it = listOfListenedEvents_.find(event_name);
+ // Empty list
+ if (it == listOfListenedEvents_.end()) {
+ listOfListenedEvents_.insert(std::pair<std::string, EventToPluginList>(
+ event_name, EventToPluginList(event_name, plugin_id, plugin_ref)));
+ return;
+ }
+ it->second.AddPluginInstance(plugin_id, plugin_ref);
+}
+
+void PluginEventRouter::RemoveEventsListeners(
+ const std::vector<std::string>& event_names,
+ PluginEventRouter::PluginEventRouterClient* plugin_ref,
+ const std::string& plugin_id) {
+ for (std::vector<std::string>::const_iterator it = event_names.begin();
+ it != event_names.end(); ++it) {
+ RemoveEventListener(*it, plugin_ref, plugin_id);
+ }
+}
+
+void PluginEventRouter::RemoveEventListener(
+ const std::string& event_name,
+ PluginEventRouter::PluginEventRouterClient* plugin_ref,
+ const std::string& plugin_id) {
+ EventListIterator it = listOfListenedEvents_.find(event_name);
+
+ if (it != listOfListenedEvents_.end()) {
+ it->second.RemovePluginInstance(plugin_id, plugin_ref);
+ if (it->second.Empty())
+ listOfListenedEvents_.erase(it);
+ }
+}
+
+bool PluginEventRouter::HasEventListener(const std::string& event_name) {
+ // Race
+ return listOfListenedEvents_.find(event_name) != listOfListenedEvents_.end();
+}
+
+bool PluginEventRouter::PluginHasEventListener(const std::string& event_name,
+ const std::string& plugin_id) {
+ // Race
+ EventListIterator it = listOfListenedEvents_.find(event_name);
+ if (it != listOfListenedEvents_.end())
+ return it->second.HasPlugin(plugin_id);
+ return false;
+}
+
+void PluginEventRouter::DispatchEventToPlugin(
+ const std::string& plugin_id,
+ scoped_ptr<extensions::Event> event) {
+ if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(
+ base::IgnoreResult(&PluginEventRouter::DispatchEventToPlugin),
+ weak_ptr_factory_.GetWeakPtr(), plugin_id,
+ base::Passed(event.Pass())));
+ return;
+ }
+ EventListIterator it = listOfListenedEvents_.find(event->event_name);
+ if (it != listOfListenedEvents_.end()) {
+ it->second.DispatchEventToPlugin(plugin_id, event->event_name,
+ event->event_args.Pass());
+ }
+}
+
+PluginListeningInstances::PluginListeningInstances(
+ const std::string& plugin_id,
+ PluginEventRouter::PluginEventRouterClient* instance_)
+ : plugin_id_(plugin_id) {
+ AddPluginInstance(instance_);
+}
+
+PluginListeningInstances::~PluginListeningInstances() {
+}
+
+void PluginListeningInstances::AddPluginInstance(
+ PluginEventRouter::PluginEventRouterClient* instance) {
+ SetOfInstancesIterator it = plugin_instances_.find(instance);
+ if (it == plugin_instances_.end())
+ plugin_instances_.insert(instance);
+}
+
+void PluginListeningInstances::RemovePluginInstance(
+ PluginEventRouter::PluginEventRouterClient* instance) {
+ SetOfInstancesIterator it = plugin_instances_.find(instance);
+ if (it != plugin_instances_.end())
+ plugin_instances_.erase(it);
+}
+
+bool PluginListeningInstances::Empty() {
+ return plugin_instances_.size() == 0 ? true : false;
+}
+
+void PluginListeningInstances::DispatchEvent(
+ std::string event_name,
+ scoped_ptr<base::ListValue> event_args) {
+ for (SetOfInstancesIterator it = plugin_instances_.begin();
+ it != plugin_instances_.end(); ++it) {
+ (*it)->OnDispatchEvent(event_name, event_args.Pass());
+ }
+}
+
+EventToPluginList::EventToPluginList(
+ const std::string& event_name,
+ const std::string& plugin_id,
+ PluginEventRouter::PluginEventRouterClient* instance)
+ : event_name_(event_name) {
+ AddPluginInstance(plugin_id, instance);
+}
+
+EventToPluginList::~EventToPluginList() {
+}
+
+void EventToPluginList::AddPluginInstance(
+ const std::string& plugin_id,
+ PluginEventRouter::PluginEventRouterClient* instance) {
+ PluginListIterator it = plugin_list_.find(plugin_id);
+ if (it == plugin_list_.end()) {
+ plugin_list_.insert(
+ std::pair<ListOfPlugins::key_type, ListOfPlugins::mapped_type>(
+ plugin_id, PluginListeningInstances(plugin_id, instance)));
+ return;
+ }
+ it->second.AddPluginInstance(instance);
+}
+
+void EventToPluginList::RemovePluginInstance(
+ const std::string& plugin_id,
+ PluginEventRouter::PluginEventRouterClient* instance) {
+ PluginListIterator it = plugin_list_.find(plugin_id);
+ if (it != plugin_list_.end()) {
+ it->second.RemovePluginInstance(instance);
+ if (it->second.Empty())
+ plugin_list_.erase(it);
+ }
+}
+
+bool EventToPluginList::Empty() {
+ return plugin_list_.size() ? true : false;
+}
+
+bool EventToPluginList::HasPlugin(const std::string& plugin_id) {
+ return plugin_list_.find(plugin_id) != plugin_list_.end();
+}
+
+void EventToPluginList::DispatchEventToPlugin(
+ std::string plugin_id,
+ std::string event_name,
+ scoped_ptr<base::ListValue> event_args) {
+ PluginListIterator it = plugin_list_.find(plugin_id);
+ // Dispatch it to all instances
+ if (it != plugin_list_.end())
+ it->second.DispatchEvent(event_name, event_args.Pass());
+}
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698