#ifndef CHROMECAST_MEDIA_AUDIO_NET_AUDIO_SOCKET_SERVICE_H_
#define CHROMECAST_MEDIA_AUDIO_NET_AUDIO_SOCKET_SERVICE_H_
#include <memory>
#include <string>
#include "base/containers/flat_map.h"
#include "base/files/file_descriptor_watcher_posix.h"
#include "base/files/scoped_file.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "net/socket/socket_descriptor.h"
namespace base {
class SequencedTaskRunner;
}
namespace net {
class ServerSocket;
class StreamSocket;
}
namespace chromecast {
namespace media {
class AudioSocketService {
public:
class Delegate {
public:
virtual void HandleAcceptedSocket(
std::unique_ptr<net::StreamSocket> socket) = 0;
protected:
virtual ~Delegate() = default;
};
AudioSocketService(const std::string& endpoint,
int port,
int max_accept_loop,
Delegate* delegate,
bool use_socket_descriptor = false);
AudioSocketService(const AudioSocketService&) = delete;
AudioSocketService& operator=(const AudioSocketService&) = delete;
~AudioSocketService();
void Accept();
static std::unique_ptr<net::StreamSocket> Connect(const std::string& endpoint,
int port);
private:
void OnAsyncAcceptComplete(int result);
bool HandleAcceptResult(int result);
int AcceptOne();
void OnAcceptSuccess();
void ReceiveFdFromSocket(int socket_fd);
const int max_accept_loop_;
const bool use_socket_descriptor_;
Delegate* const delegate_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
std::unique_ptr<net::ServerSocket> listen_socket_;
std::unique_ptr<net::StreamSocket> accepted_socket_;
net::SocketDescriptor accepted_descriptor_ = net::kInvalidSocket;
base::flat_map<int ,
std::unique_ptr<base::FileDescriptorWatcher::Controller>>
fd_watcher_controllers_;
base::WeakPtrFactory<AudioSocketService> weak_factory_{this};
};
}
}
#endif