root/src/servers/app/drawing/interface/remote/NetSender.cpp
/*
 * Copyright 2009, Haiku, Inc.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Michael Lotz <mmlr@mlotz.ch>
 */

#include "NetSender.h"

#include "StreamingRingBuffer.h"

#include <NetEndpoint.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRACE(x...)                     /*debug_printf("NetSender: " x)*/
#define TRACE_ERROR(x...)       debug_printf("NetSender: " x)


NetSender::NetSender(BNetEndpoint *endpoint, StreamingRingBuffer *source)
        :
        fEndpoint(endpoint),
        fSource(source),
        fSenderThread(-1),
        fStopThread(false)
{
        fSenderThread = spawn_thread(_NetworkSenderEntry, "network sender",
                B_NORMAL_PRIORITY, this);
        resume_thread(fSenderThread);
}


NetSender::~NetSender()
{
        fStopThread = true;

        suspend_thread(fSenderThread);
        resume_thread(fSenderThread);
}


int32
NetSender::_NetworkSenderEntry(void *data)
{
        return ((NetSender *)data)->_NetworkSender();
}


status_t
NetSender::_NetworkSender()
{
        while (!fStopThread) {
                uint8 buffer[4096];
                int32 readSize = fSource->Read(buffer, sizeof(buffer), true);
                if (readSize < 0) {
                        TRACE_ERROR("read failed, stopping sender thread: %s\n",
                                strerror(readSize));
                        return readSize;
                }

                while (readSize > 0) {
                        int32 sendSize = fEndpoint->Send(buffer, readSize);
                        if (sendSize < 0) {
                                TRACE_ERROR("sending data failed: %s\n", strerror(sendSize));
                                return sendSize;
                        }

                        readSize -= sendSize;
                }
        }

        return B_OK;
}