Index: content/browser/gamepad/gamepad_service.cc |
diff --git a/content/browser/gamepad/gamepad_service.cc b/content/browser/gamepad/gamepad_service.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..424518cbbe51800e4503602bb1a1dccc67a446ef |
--- /dev/null |
+++ b/content/browser/gamepad/gamepad_service.cc |
@@ -0,0 +1,89 @@ |
+// Copyright (c) 2011 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 "content/browser/gamepad/gamepad_service.h" |
+ |
+#include "content/browser/gamepad/data_fetcher.h" |
+#include "content/browser/gamepad/gamepad_provider.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/notification_source.h" |
+#include "content/public/browser/notification_types.h" |
+#include "content/public/browser/render_process_host.h" |
+ |
+namespace content { |
+ |
+GamepadService* GamepadService::instance_; |
+ |
+GamepadService::GamepadService() : num_readers_(0) { |
+} |
+ |
+GamepadService::~GamepadService() { |
+} |
+ |
+GamepadService* GamepadService::GetInstance() { |
+ if (!instance_) { |
+ instance_ = new GamepadService(); |
+ instance_->AddRef(); |
+ } |
+ return instance_; |
+} |
+ |
+void GamepadService::Start( |
+ GamepadDataFetcher* data_fetcher, |
+ content::RenderProcessHost* associated_rph) { |
+ num_readers_++; |
+ if (!provider_) |
+ provider_ = new GamepadProvider(data_fetcher); |
+ DCHECK(num_readers_ > 0); |
+ provider_->Resume(); |
+ |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GamepadService::RegisterForCloseNotification, |
+ this, |
+ associated_rph)); |
+} |
+ |
+void GamepadService::RegisterForCloseNotification( |
+ content::RenderProcessHost* rph) { |
+ registrar_.Add(this, |
+ content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
+ content::Source<content::RenderProcessHost>(rph)); |
+} |
+ |
+base::SharedMemoryHandle GamepadService::GetSharedMemoryHandle( |
+ base::ProcessHandle handle) { |
+ DCHECK(provider_); |
+ return provider_->GetRendererSharedMemoryHandle(handle); |
+} |
+ |
+void GamepadService::Stop() { |
+ --num_readers_; |
+ DCHECK(provider_); |
+ DCHECK(num_readers_ >= 0); |
+ |
+ if (num_readers_ == 0) |
+ provider_->Pause(); |
+} |
+ |
+void GamepadService::Observe(int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ switch (type) { |
+ case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&GamepadService::Stop, this)); |
+ break; |
+ } |
+ default: { |
+ break; |
+ } |
+ } |
+} |
+ |
+} // namespace content |