// 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.

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-private-field"
#elif defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable:4056)
#pragma warning(disable:4065)
#pragma warning(disable:4756)
#endif


#include "components/mirroring/mojom/resource_provider.mojom-test-utils.h"

#include <utility>

#include "base/bind.h"
#include "base/run_loop.h"
#include "media/capture/mojom/video_capture.mojom.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "media/mojo/interfaces/remoting.mojom.h"
#include "media/mojo/interfaces/audio_data_pipe.mojom.h"
#include "media/mojo/interfaces/audio_input_stream.mojom.h"
#include "media/mojo/interfaces/audio_parameters.mojom.h"


#ifndef COMPONENTS_MIRRORING_MOJOM_RESOURCE_PROVIDER_MOJOM_JUMBO_H_
#define COMPONENTS_MIRRORING_MOJOM_RESOURCE_PROVIDER_MOJOM_JUMBO_H_
#include "media/base/ipc/media_param_traits.h"
#include "mojo/public/cpp/base/shared_memory_mojom_traits.h"
#endif


namespace mirroring {
namespace mojom {


void AudioStreamCreatorClientInterceptorForTesting::StreamCreated(::media::mojom::AudioInputStreamPtr stream, ::media::mojom::AudioInputStreamClientRequest client_request, ::media::mojom::ReadOnlyAudioDataPipePtr data_pipe, bool initially_muted) {
  GetForwardingInterface()->StreamCreated(std::move(stream), std::move(client_request), std::move(data_pipe), std::move(initially_muted));
}
AudioStreamCreatorClientAsyncWaiter::AudioStreamCreatorClientAsyncWaiter(
    AudioStreamCreatorClient* proxy) : proxy_(proxy) {}

AudioStreamCreatorClientAsyncWaiter::~AudioStreamCreatorClientAsyncWaiter() = default;




void ResourceProviderInterceptorForTesting::GetVideoCaptureHost(::media::mojom::VideoCaptureHostRequest request) {
  GetForwardingInterface()->GetVideoCaptureHost(std::move(request));
}
void ResourceProviderInterceptorForTesting::GetNetworkContext(::network::mojom::NetworkContextRequest request) {
  GetForwardingInterface()->GetNetworkContext(std::move(request));
}
void ResourceProviderInterceptorForTesting::CreateAudioStream(AudioStreamCreatorClientPtr client, const media::AudioParameters& param, uint32_t shared_memory_count) {
  GetForwardingInterface()->CreateAudioStream(std::move(client), std::move(param), std::move(shared_memory_count));
}
void ResourceProviderInterceptorForTesting::ConnectToRemotingSource(::media::mojom::RemoterPtr remoter, ::media::mojom::RemotingSourceRequest request) {
  GetForwardingInterface()->ConnectToRemotingSource(std::move(remoter), std::move(request));
}
ResourceProviderAsyncWaiter::ResourceProviderAsyncWaiter(
    ResourceProvider* proxy) : proxy_(proxy) {}

ResourceProviderAsyncWaiter::~ResourceProviderAsyncWaiter() = default;






}  // namespace mojom
}  // namespace mirroring

#if defined(__clang__)
#pragma clang diagnostic pop
#elif defined(_MSC_VER)
#pragma warning(pop)
#endif