Index: components/proximity_auth/throttled_bluetooth_connection_finder.cc |
diff --git a/components/proximity_auth/throttled_bluetooth_connection_finder.cc b/components/proximity_auth/throttled_bluetooth_connection_finder.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..252a47f9ec03f37b4ad9994617ccfd0664ed55be |
--- /dev/null |
+++ b/components/proximity_auth/throttled_bluetooth_connection_finder.cc |
@@ -0,0 +1,55 @@ |
+// 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 "components/proximity_auth/throttled_bluetooth_connection_finder.h" |
+ |
+#include "base/bind.h" |
+#include "base/location.h" |
+#include "base/task_runner.h" |
+#include "base/time/time.h" |
+#include "components/proximity_auth/bluetooth_connection_finder.h" |
+#include "components/proximity_auth/bluetooth_throttler.h" |
+ |
+namespace proximity_auth { |
+ |
+ThrottledBluetoothConnectionFinder::ThrottledBluetoothConnectionFinder( |
+ scoped_ptr<BluetoothConnectionFinder> connection_finder, |
+ scoped_refptr<base::TaskRunner> task_runner, |
+ BluetoothThrottler* throttler) |
+ : connection_finder_(connection_finder.Pass()), |
+ task_runner_(task_runner), |
+ throttler_(throttler), |
+ weak_ptr_factory_(this) { |
+} |
+ |
+ThrottledBluetoothConnectionFinder::~ThrottledBluetoothConnectionFinder() { |
+} |
+ |
+void ThrottledBluetoothConnectionFinder::Find( |
+ const ConnectionCallback& connection_callback) { |
+ const base::TimeDelta delay = throttler_->GetDelay(); |
+ |
+ // Wait, if needed. |
+ if (delay != base::TimeDelta()) { |
+ task_runner_->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&ThrottledBluetoothConnectionFinder::Find, |
+ weak_ptr_factory_.GetWeakPtr(), connection_callback), |
+ delay); |
+ return; |
+ } |
+ |
+ connection_finder_->Find( |
+ base::Bind(&ThrottledBluetoothConnectionFinder::OnConnection, |
+ weak_ptr_factory_.GetWeakPtr(), connection_callback)); |
+} |
+ |
+void ThrottledBluetoothConnectionFinder::OnConnection( |
+ const ConnectionCallback& connection_callback, |
+ scoped_ptr<Connection> connection) { |
+ throttler_->OnConnection(connection.get()); |
+ connection_callback.Run(connection.Pass()); |
+} |
+ |
+} // namespace proximity_auth |