blob: ac0b2c318b278e5be2393daedfa0639d3579e2f0 [file] [log] [blame]
isherman06c6a9a72014-09-10 05:48:211// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
hansberrye7ad3892016-12-19 22:19:215#include "components/cryptauth/connection.h"
isherman06c6a9a72014-09-10 05:48:216
dcheng51ace48a2015-12-26 22:45:177#include <utility>
8
isherman06c6a9a72014-09-10 05:48:219#include "base/logging.h"
hansberrye7ad3892016-12-19 22:19:2110#include "components/cryptauth/connection_observer.h"
11#include "components/cryptauth/wire_message.h"
isherman06c6a9a72014-09-10 05:48:2112
hansberrye7ad3892016-12-19 22:19:2113namespace cryptauth {
isherman06c6a9a72014-09-10 05:48:2114
khorimotof7a6aff2017-01-19 22:50:4715Connection::Connection(const RemoteDevice& remote_device)
isherman06c6a9a72014-09-10 05:48:2116 : remote_device_(remote_device),
17 status_(DISCONNECTED),
khorimotode98b9e2016-12-07 22:28:5518 is_sending_message_(false) {}
isherman06c6a9a72014-09-10 05:48:2119
hansberrye7ad3892016-12-19 22:19:2120Connection::~Connection() {}
isherman06c6a9a72014-09-10 05:48:2121
22bool Connection::IsConnected() const {
23 return status_ == CONNECTED;
24}
25
dcheng2f012692016-04-21 00:19:3426void Connection::SendMessage(std::unique_ptr<WireMessage> message) {
isherman06c6a9a72014-09-10 05:48:2127 if (!IsConnected()) {
28 VLOG(1) << "Cannot send message when disconnected.";
29 return;
30 }
31
32 if (is_sending_message_) {
33 VLOG(1) << "Another message is currently in progress.";
34 return;
35 }
36
37 is_sending_message_ = true;
dcheng51ace48a2015-12-26 22:45:1738 SendMessageImpl(std::move(message));
isherman06c6a9a72014-09-10 05:48:2139}
40
41void Connection::AddObserver(ConnectionObserver* observer) {
42 observers_.AddObserver(observer);
43}
44
45void Connection::RemoveObserver(ConnectionObserver* observer) {
46 observers_.RemoveObserver(observer);
47}
48
sacomotoe4ca7e262015-09-30 14:27:5649std::string Connection::GetDeviceAddress() {
50 return remote_device_.bluetooth_address;
51}
52
isherman06c6a9a72014-09-10 05:48:2153void Connection::SetStatus(Status status) {
54 if (status_ == status)
55 return;
56
57 received_bytes_.clear();
58
59 Status old_status = status_;
60 status_ = status;
ericwilligersfe109cd2016-10-19 01:45:5161 for (auto& observer : observers_)
62 observer.OnConnectionStatusChanged(this, old_status, status_);
isherman06c6a9a72014-09-10 05:48:2163}
64
65void Connection::OnDidSendMessage(const WireMessage& message, bool success) {
66 if (!is_sending_message_) {
67 VLOG(1) << "Send completed, but no message in progress.";
68 return;
69 }
70
71 is_sending_message_ = false;
ericwilligersfe109cd2016-10-19 01:45:5172 for (auto& observer : observers_)
73 observer.OnSendCompleted(*this, message, success);
isherman06c6a9a72014-09-10 05:48:2174}
75
76void Connection::OnBytesReceived(const std::string& bytes) {
77 if (!IsConnected()) {
78 VLOG(1) << "Received bytes, but not connected.";
79 return;
80 }
81
82 received_bytes_ += bytes;
isherman06c6a9a72014-09-10 05:48:2183
isherman3ca088e12014-09-16 00:21:0384 bool is_incomplete_message;
dcheng2f012692016-04-21 00:19:3485 std::unique_ptr<WireMessage> message =
isherman3ca088e12014-09-16 00:21:0386 DeserializeWireMessage(&is_incomplete_message);
87 if (is_incomplete_message)
88 return;
89
90 if (message) {
ericwilligersfe109cd2016-10-19 01:45:5191 for (auto& observer : observers_)
92 observer.OnMessageReceived(*this, *message);
isherman06c6a9a72014-09-10 05:48:2193 }
isherman3ca088e12014-09-16 00:21:0394
95 // Whether the message was parsed successfully or not, clear the
96 // |received_bytes_| buffer.
97 received_bytes_.clear();
isherman06c6a9a72014-09-10 05:48:2198}
99
dcheng2f012692016-04-21 00:19:34100std::unique_ptr<WireMessage> Connection::DeserializeWireMessage(
isherman3ca088e12014-09-16 00:21:03101 bool* is_incomplete_message) {
102 return WireMessage::Deserialize(received_bytes_, is_incomplete_message);
isherman06c6a9a72014-09-10 05:48:21103}
104
hansberrye7ad3892016-12-19 22:19:21105} // namespace cryptauth