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

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

Issue 1093383002: [WIP] Provided file system from NACL. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved several modules to chromeos folder. Created 5 years, 5 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/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

Powered by Google App Engine
This is Rietveld 408576698