Index: chrome/browser/chromeos/file_system_provider/file_system_plugin/plugin_operation_router.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/file_system_plugin/plugin_operation_router.cc b/chrome/browser/chromeos/file_system_provider/file_system_plugin/plugin_operation_router.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3aad8c03c4fbde52c06d8d179da3549f6466470e |
--- /dev/null |
+++ b/chrome/browser/chromeos/file_system_provider/file_system_plugin/plugin_operation_router.cc |
@@ -0,0 +1,113 @@ |
+// 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/plugin_operation_router.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 { |
+namespace file_system_provider { |
+PluginOperationRouter::PluginOperationRouter() : weak_ptr_factory_(this) { |
+} |
+ |
+PluginOperationRouter::~PluginOperationRouter() { |
+} |
+ |
+// Static |
+PluginOperationRouter* PluginOperationRouter::GetInstance() { |
+ return Singleton<PluginOperationRouter>::get(); |
+} |
+ |
+void PluginOperationRouter::AddOperationsForListener( |
+ const std::vector<RequestType>& operation_types, |
+ PluginOperationRouterClient* plugin_ref, |
+ const std::string& plugin_id) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ for ( |
+ std::vector<RequestType>::const_iterator it = |
+ operation_types.begin(); |
+ it != operation_types.end(); ++it) { |
+ AddOperationForListener(*it, plugin_ref, plugin_id); |
+ } |
+} |
+ |
+void PluginOperationRouter::AddOperationForListener( |
+ RequestType operation_type, |
+ PluginOperationRouterClient* plugin_ref, |
+ const std::string& plugin_id) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ OperationsListIterator it = listOfListenedEvents_.find(operation_type); |
+ // If the event is not in the list add it |
+ if (it == listOfListenedEvents_.end()) { |
+ it = listOfListenedEvents_.insert(listOfListenedEvents_.begin(), |
+ std::make_pair(operation_type, |
+ PluginInstances() ) ); |
+ } |
+ it->second.insert( std::make_pair(plugin_id, plugin_ref) ); |
+} |
+ |
+void PluginOperationRouter::RemoveOperationsForListener( |
+ const std::vector<RequestType>& operation_types, |
+ const std::string& plugin_id) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ for (std::vector<RequestType>::const_iterator |
+ it = operation_types.begin(); |
+ it != operation_types.end(); ++it) { |
+ RemoveOperationForListener(*it, plugin_id); |
+ } |
+} |
+ |
+void PluginOperationRouter::RemoveOperationForListener( |
+ RequestType operation_type, |
+ const std::string& plugin_id) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ OperationsListIterator it = listOfListenedEvents_.find(operation_type); |
+ |
+ if (it!=listOfListenedEvents_.end()) { |
+ PluginInstancesIterator plugin_it = it->second.find(plugin_id); |
+ if (plugin_it!=it->second.end()) |
+ it->second.erase(plugin_it); |
+ if(it->second.size()==0) |
+ listOfListenedEvents_.erase(it); |
+ } |
+} |
+ |
+bool PluginOperationRouter::PluginHasOperationListener( |
+ RequestType operation_type, |
+ const std::string& plugin_id) { |
+ OperationsListIterator it = listOfListenedEvents_.find(operation_type); |
+ if (it != listOfListenedEvents_.end()) |
+ return it->second.find(plugin_id)!=it->second.end(); |
+ return false; |
+} |
+ |
+void PluginOperationRouter::DispatchOperationToPlugin( |
+ const std::string& plugin_id, |
+ scoped_ptr<extensions::Event> request) { |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind( |
+ base::IgnoreResult(&PluginOperationRouter::DispatchOperationToPlugin), |
+ weak_ptr_factory_.GetWeakPtr(), plugin_id, |
+ base::Passed(request.Pass()))); |
+ return; |
+ } |
+ RequestType type = ProvidedFileSystemAdapter::OperationTypeFromExtensionEvent( |
+ request->event_name); |
+ OperationsListIterator it = listOfListenedEvents_.find(type); |
+ if (it != listOfListenedEvents_.end()) { |
+ PluginInstancesIterator plugin_it = it->second.find( plugin_id ); |
+ if (plugin_it!=it->second.end()) |
+ plugin_it->second->OnDispatchOperationRequest(type, |
+ request->event_args.Pass()); |
+ } |
+} |
+} // namespace file_system_provider |
+} // namespace chromeos |