#include "qvnc.h"

QVnc::QVnc()
{
    // Don't let Qt change the size of the OpenGL framebuffer
    setTextureFollowsItemSize(false);

    m_dispatcher = new Dispatcher;
    m_dispatcher->moveToThread(&m_dispatcher_thread);

    connect(&m_dispatcher_thread, &QThread::finished, m_dispatcher, &QObject::deleteLater);

    connect(this, &QVnc::open_connection, m_dispatcher, &Dispatcher::open);
    connect(this, &QVnc::terminate_connection, m_dispatcher, &Dispatcher::terminate);

    connect(m_dispatcher, &Dispatcher::updateFramebuffer, this, &QVnc::update);

    QThreadPool::globalInstance()->reserveThread();
    m_dispatcher_thread.start();
}

QVnc::~QVnc()
{
    m_dispatcher_thread.quit();
    m_dispatcher_thread.wait();
}

void QVnc::open()
{
    emit open_connection(this->m_host, this->m_port);
}

void QVnc::terminate()
{
    emit terminate_connection();
}

void QVnc::setHost(QString host)
{
    if (m_host == host)
        return;

    m_host = host;
    emit hostChanged(host);
}

void QVnc::setPort(int port)
{
    if (m_port == port)
        return;

    m_port = port;
    emit portChanged(port);
}

QQuickFramebufferObject::Renderer *QVnc::createRenderer() const
{
    VncRenderer *renderer = new VncRenderer();
    connect(renderer, &VncRenderer::rendered, m_dispatcher, &Dispatcher::refresh);
    connect(m_dispatcher &Dispatcher::resizeFramebuffer, renderer, &VncRenderer::invalidateFramebufferObject);
    return renderer;
}

QString QVnc::host() const
{
    return m_host;
}

int QVnc::port() const
{
    return m_port;
}