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..8b4598ed0eb7ce5480ddbb205d18781e828756a1 |
--- /dev/null |
+++ b/components/proximity_auth/throttled_bluetooth_connection_finder.cc |
@@ -0,0 +1,75 @@ |
+// 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" |
+#include "components/proximity_auth/connection.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), |
+ connection_(nullptr), |
+ weak_ptr_factory_(this) { |
+} |
+ |
+ThrottledBluetoothConnectionFinder::~ThrottledBluetoothConnectionFinder() { |
+ if (connection_) |
+ connection_->RemoveObserver(this); |
+} |
+ |
+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) { |
+ DCHECK(!connection_); |
+ connection_ = connection.get(); |
+ connection_->AddObserver(this); |
+ |
+ connection_callback.Run(connection.Pass()); |
+} |
+ |
+void ThrottledBluetoothConnectionFinder::OnConnectionStatusChanged( |
+ const Connection& connection, |
+ Connection::Status old_status, |
+ Connection::Status new_status) { |
+ DCHECK_EQ(&connection, connection_); |
+ if (old_status == Connection::CONNECTED && |
+ new_status == Connection::DISCONNECTED) { |
+ throttler_->OnConnectionClosed(); |
Tim Song
2015/04/17 22:34:31
Using the ThrottledBluetoothConnectionFinder insta
Ilya Sherman
2015/04/22 00:48:59
Good point. Done.
|
+ connection_->RemoveObserver(this); |
+ connection_ = nullptr; |
+ } |
+} |
+ |
+} // namespace proximity_auth |