1/*
2 * Copyright 2009, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Michael Lotz <mmlr@mlotz.ch>
7 */
8
9#include "NetSender.h"
10
11#include "StreamingRingBuffer.h"
12
13#include <NetEndpoint.h>
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <string.h>
18
19#define TRACE(x...)			/*debug_printf("NetSender: "x)*/
20#define TRACE_ERROR(x...)	debug_printf("NetSender: "x)
21
22
23NetSender::NetSender(BNetEndpoint *endpoint, StreamingRingBuffer *source)
24	:
25	fEndpoint(endpoint),
26	fSource(source),
27	fSenderThread(-1),
28	fStopThread(false)
29{
30	fSenderThread = spawn_thread(_NetworkSenderEntry, "network sender",
31		B_NORMAL_PRIORITY, this);
32	resume_thread(fSenderThread);
33}
34
35
36NetSender::~NetSender()
37{
38	fStopThread = true;
39	int32 result;
40	wait_for_thread(fSenderThread, &result);
41}
42
43
44int32
45NetSender::_NetworkSenderEntry(void *data)
46{
47	return ((NetSender *)data)->_NetworkSender();
48}
49
50
51status_t
52NetSender::_NetworkSender()
53{
54	while (!fStopThread) {
55		uint8 buffer[4096];
56		int32 readSize = fSource->Read(buffer, sizeof(buffer), true);
57		if (readSize < 0) {
58			TRACE_ERROR("read failed, stopping sender thread: %s\n",
59				strerror(readSize));
60			return readSize;
61		}
62
63		while (readSize > 0) {
64			int32 sendSize = fEndpoint->Send(buffer, readSize);
65			if (sendSize < 0) {
66				TRACE_ERROR("sending data failed: %s\n", strerror(sendSize));
67				return sendSize;
68			}
69
70			readSize -= sendSize;
71		}
72	}
73
74	return B_OK;
75}
76