#ifndef RTC_TCP_TRANSPORT_H
#define RTC_TCP_TRANSPORT_H
#include "include.hpp"
#include "queue.hpp"
#include "transport.hpp"
#if RTC_ENABLE_WEBSOCKET
#include <mutex>
#include <thread>
#include "../deps/libjuice/src/socket.h"
namespace rtc {
class SelectInterrupter {
public:
SelectInterrupter();
~SelectInterrupter();
int prepare(fd_set &readfds, fd_set &writefds);
void interrupt();
private:
std::mutex mMutex;
#ifdef _WIN32
socket_t mDummySock = INVALID_SOCKET;
#else
int mPipeIn, mPipeOut;
#endif
};
class TcpTransport : public Transport {
public:
TcpTransport(const string &hostname, const string &service, state_callback callback);
~TcpTransport();
void start() override;
bool stop() override;
bool send(message_ptr message) override;
void incoming(message_ptr message) override;
bool outgoing(message_ptr message) override;
private:
void connect(const string &hostname, const string &service);
void connect(const sockaddr *addr, socklen_t addrlen);
void close();
bool trySendQueue();
bool trySendMessage(message_ptr &message);
void runLoop();
int prepareSelect(fd_set &readfds, fd_set &writefds);
void interruptSelect();
string mHostname, mService;
socket_t mSock = INVALID_SOCKET;
std::mutex mSockMutex;
std::thread mThread;
SelectInterrupter mInterrupter;
Queue<message_ptr> mSendQueue;
};
}
#endif
#endif