#ifndef CHROMECAST_MEDIA_AUDIO_AUDIO_OUTPUT_SERVICE_OUTPUT_CONNECTION_H_
#define CHROMECAST_MEDIA_AUDIO_AUDIO_OUTPUT_SERVICE_OUTPUT_CONNECTION_H_
#include <memory>
#include "base/memory/weak_ptr.h"
#include "chromecast/common/mojom/audio_socket.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/platform/platform_handle.h"
namespace net {
class StreamSocket;
}
namespace chromecast {
namespace media {
namespace audio_output_service {
class OutputSocket;
class OutputConnection {
public:
explicit OutputConnection(
mojo::PendingRemote<mojom::AudioSocketBroker> pending_socket_broker);
OutputConnection(const OutputConnection&) = delete;
OutputConnection& operator=(const OutputConnection&) = delete;
virtual ~OutputConnection();
void Connect();
protected:
virtual void OnConnected(std::unique_ptr<OutputSocket> socket) = 0;
virtual void OnConnectionFailed() = 0;
private:
void HandleConnectResult(int result);
void OnSocketDescriptor(mojo::PlatformHandle handle);
const mojo::Remote<mojom::AudioSocketBroker> socket_broker_;
std::unique_ptr<net::StreamSocket> connecting_socket_;
bool log_connection_failure_ = true;
int retry_count_ = 0;
base::WeakPtrFactory<OutputConnection> weak_factory_{this};
};
}
}
}
#endif