blob: ed4d0100ffc644fc28bee4ddf21b13ffc11e9921 [file] [log] [blame]
// Copyright 2019 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 "remoting/protocol/remoting_ice_config_request.h"
#include <utility>
#include "base/bind.h"
#include "build/build_config.h"
#include "google_apis/google_api_keys.h"
#include "remoting/base/grpc_support/grpc_async_executor.h"
#include "remoting/base/grpc_support/grpc_async_unary_request.h"
#include "remoting/base/grpc_support/grpc_channel.h"
#include "remoting/base/service_urls.h"
#include "remoting/proto/remoting/v1/network_traversal_service.grpc.pb.h"
#include "remoting/protocol/ice_config.h"
namespace remoting {
namespace protocol {
namespace {
using GetIceConfigCallback =
base::OnceCallback<void(const grpc::Status&,
const apis::v1::GetIceConfigResponse&)>;
} // namespace
class RemotingIceConfigRequest::NetworkTraversalClient {
public:
NetworkTraversalClient();
explicit NetworkTraversalClient(GrpcChannelSharedPtr channel);
~NetworkTraversalClient();
void GetIceConfig(GetIceConfigCallback callback);
private:
using NetworkTraversalService = apis::v1::RemotingNetworkTraversalService;
GrpcAsyncExecutor executor_;
std::unique_ptr<NetworkTraversalService::Stub> network_traversal_;
};
RemotingIceConfigRequest::NetworkTraversalClient::NetworkTraversalClient()
: NetworkTraversalClient(CreateSslChannelForEndpoint(
ServiceUrls::GetInstance()->remoting_server_endpoint())) {}
RemotingIceConfigRequest::NetworkTraversalClient::NetworkTraversalClient(
GrpcChannelSharedPtr channel) {
network_traversal_ = NetworkTraversalService::NewStub(channel);
}
RemotingIceConfigRequest::NetworkTraversalClient::~NetworkTraversalClient() =
default;
void RemotingIceConfigRequest::NetworkTraversalClient::GetIceConfig(
GetIceConfigCallback callback) {
auto async_request = CreateGrpcAsyncUnaryRequest(
base::BindOnce(&NetworkTraversalService::Stub::AsyncGetIceConfig,
base::Unretained(network_traversal_.get())),
apis::v1::GetIceConfigRequest(), std::move(callback));
async_request->context()->AddMetadata("x-goog-api-key",
google_apis::GetRemotingAPIKey());
executor_.ExecuteRpc(std::move(async_request));
}
// End of RemotingIceConfigRequest::NetworkTraversalClient
RemotingIceConfigRequest::RemotingIceConfigRequest() {
network_traversal_client_ = std::make_unique<NetworkTraversalClient>();
}
RemotingIceConfigRequest::~RemotingIceConfigRequest() = default;
void RemotingIceConfigRequest::Send(OnIceConfigCallback callback) {
DCHECK(on_ice_config_callback_.is_null());
DCHECK(!callback.is_null());
on_ice_config_callback_ = std::move(callback);
network_traversal_client_->GetIceConfig(base::BindOnce(
&RemotingIceConfigRequest::OnResponse, base::Unretained(this)));
}
void RemotingIceConfigRequest::SetGrpcChannelForTest(
GrpcChannelSharedPtr channel) {
network_traversal_client_ = std::make_unique<NetworkTraversalClient>(channel);
}
void RemotingIceConfigRequest::OnResponse(
const grpc::Status& status,
const apis::v1::GetIceConfigResponse& response) {
DCHECK(!on_ice_config_callback_.is_null());
if (!status.ok()) {
LOG(ERROR) << "Received error code: " << status.error_code()
<< ", message: " << status.error_message();
std::move(on_ice_config_callback_).Run(IceConfig());
return;
}
std::move(on_ice_config_callback_).Run(IceConfig::Parse(response));
}
} // namespace protocol
} // namespace remoting