/* * Copyright 2009, Haiku, Inc. * Distributed under the terms of the MIT License. * * Authors: * Michael Lotz */ #include "NetSender.h" #include "StreamingRingBuffer.h" #include #include #include #include #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; }