#ifndef RTC_TLS_TRANSPORT_H
#define RTC_TLS_TRANSPORT_H
#include "include.hpp"
#include "queue.hpp"
#include "tls.hpp"
#include "transport.hpp"
#if RTC_ENABLE_WEBSOCKET
#include <thread>
namespace rtc {
class TcpTransport;
class TlsTransport : public Transport {
public:
static void Init();
static void Cleanup();
TlsTransport(std::shared_ptr<TcpTransport> lower, string host, state_callback callback);
virtual ~TlsTransport();
void start() override;
bool stop() override;
bool send(message_ptr message) override;
protected:
virtual void incoming(message_ptr message) override;
virtual void postHandshake();
void runRecvLoop();
string mHost;
Queue<message_ptr> mIncomingQueue;
std::thread mRecvThread;
#if USE_GNUTLS
gnutls_session_t mSession;
gnutls_certificate_credentials_t mCreds;
message_ptr mIncomingMessage;
size_t mIncomingMessagePosition = 0;
static ssize_t WriteCallback(gnutls_transport_ptr_t ptr, const void *data, size_t len);
static ssize_t ReadCallback(gnutls_transport_ptr_t ptr, void *data, size_t maxlen);
static int TimeoutCallback(gnutls_transport_ptr_t ptr, unsigned int ms);
#else
SSL_CTX *mCtx;
SSL *mSsl;
BIO *mInBio, *mOutBio;
static int TransportExIndex;
static int CertificateCallback(int preverify_ok, X509_STORE_CTX *ctx);
static void InfoCallback(const SSL *ssl, int where, int ret);
#endif
};
}
#endif
#endif