| Index: remoting/host/chromoting_host.cc
|
| diff --git a/remoting/host/chromoting_host.cc b/remoting/host/chromoting_host.cc
|
| index c137d55d2ba337923ff3b32d6cae3aef6cbf7c04..eb9e182c548aaa28402891be547fb562d9182270 100644
|
| --- a/remoting/host/chromoting_host.cc
|
| +++ b/remoting/host/chromoting_host.cc
|
| @@ -177,30 +177,24 @@ void ChromotingHost::OnSessionAuthenticated(ClientSession* client) {
|
|
|
| login_backoff_.Reset();
|
|
|
| - // Disconnect all other clients. |it| should be advanced before Disconnect()
|
| - // is called to avoid it becoming invalid when the client is removed from
|
| - // the list.
|
| - ClientList::iterator it = clients_.begin();
|
| + // Disconnect all clients, except |client|.
|
| base::WeakPtr<ChromotingHost> self = weak_factory_.GetWeakPtr();
|
| - while (it != clients_.end()) {
|
| - ClientSession* other_client = *it++;
|
| - if (other_client != client) {
|
| - other_client->DisconnectSession(protocol::OK);
|
| -
|
| - // Quit if the host was destroyed.
|
| - if (!self)
|
| - return;
|
| - }
|
| + while (clients_.size() > 1) {
|
| + clients_[(clients_.front().get() == client) ? 1 : 0]->DisconnectSession(
|
| + protocol::OK);
|
| +
|
| + // Quit if the host was destroyed.
|
| + if (!self)
|
| + return;
|
| }
|
|
|
| // Disconnects above must have destroyed all other clients.
|
| DCHECK_EQ(clients_.size(), 1U);
|
| + DCHECK(clients_.front().get() == client);
|
|
|
| // Notify observers that there is at least one authenticated client.
|
| - const std::string& jid = client->client_jid();
|
| -
|
| for (auto& observer : status_observers_)
|
| - observer.OnClientAuthenticated(jid);
|
| + observer.OnClientAuthenticated(client->client_jid());
|
| }
|
|
|
| void ChromotingHost::OnSessionChannelsConnected(ClientSession* client) {
|
| @@ -222,13 +216,16 @@ void ChromotingHost::OnSessionAuthenticationFailed(ClientSession* client) {
|
| void ChromotingHost::OnSessionClosed(ClientSession* client) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| - ClientList::iterator it = std::find(clients_.begin(), clients_.end(), client);
|
| + ClientSessions::iterator it =
|
| + std::find_if(clients_.begin(), clients_.end(),
|
| + [client](const std::unique_ptr<ClientSession>& item) {
|
| + return item.get() == client;
|
| + });
|
| CHECK(it != clients_.end());
|
|
|
| bool was_authenticated = client->is_authenticated();
|
| std::string jid = client->client_jid();
|
| clients_.erase(it);
|
| - delete client;
|
|
|
| if (was_authenticated) {
|
| for (auto& observer : status_observers_)
|
| @@ -277,11 +274,9 @@ void ChromotingHost::OnIncomingSession(
|
| }
|
|
|
| // Create a ClientSession object.
|
| - ClientSession* client = new ClientSession(
|
| + clients_.push_back(base::MakeUnique<ClientSession>(
|
| this, std::move(connection), desktop_environment_factory_,
|
| - max_session_duration_, pairing_registry_, extensions_.get());
|
| -
|
| - clients_.push_back(client);
|
| + max_session_duration_, pairing_registry_, extensions_.get()));
|
| }
|
|
|
| void ChromotingHost::DisconnectAllClients() {
|
|
|