jmulticastsocketbuffer.cpp 3.25 KB
/***************************************************************************
 *   Copyright (C) 2005 by Jeff Ferr                                       *
 *   root@sat                                                              *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "jmulticastsocketbuffer.h"
#include "jsocketexception.h"
#include "jioexception.h"

#include <stdio.h>
#include <errno.h>

namespace jsocket {

MulticastSocketBuffer::MulticastSocketBuffer(int16_t fds_, int16_t fdr_, sockaddr_in sock_s_, sockaddr_in sock_r_, uint32_t size_)//:
    // std::streambuf()
{
	_fds = fds_;
	_fdr = fdr_;
	_sock_s = sock_s_;
	_sock_r = sock_r_;
	_size_buffer = size_;
	
	_buffer_in = new char[size_];
	_buffer_out = new char[size_];

	// TODO:: if (buffer_in || buffer_out) == NULL
	
	setg(_buffer_in, _buffer_in, _buffer_in);
	setp(_buffer_out, _buffer_out + size_);

	_sent_bytes = 0LL;
	_receive_bytes = 0LL;
}

MulticastSocketBuffer::~MulticastSocketBuffer()
{
	delete [] _buffer_in;
	delete [] _buffer_out;
}

int MulticastSocketBuffer::sync()
{
	std::streamsize n = pptr() - pbase();

	int16_t sent;
	
	sent = sendto(_fds, pbase(), n, 0, (SA*)&_sock_s, sizeof(_sock_s));

	if (n && sent != n) {
		return EOF;
    }

	_sent_bytes += sent;

	pbump(-n);

	return 0;
}

int MulticastSocketBuffer::overflow(int ch)
{
	if (sync() == EOF) {
        return EOF;
    }

	if (ch != EOF) {
		pbase()[0] = ch;
		pbump(1);
	}

	return 0;
}

int MulticastSocketBuffer::underflow()
{
	int n, size;

	size = sizeof(struct sockaddr_in);

	n = recvfrom(_fdr, eback(), _size_buffer, 0, (SA *)&_sock_r, (socklen_t*)&size);

	if (n < 0 && errno == EAGAIN) {
		throw SocketException("Socket timeout exception !");
	} else if (n < 0) {
		throw IOException("Read socket error !");
	}

	_receive_bytes += n;

	setg(eback(), eback(), eback()+n);

	return *eback();
}

uint64_t MulticastSocketBuffer::GetSentBytes()
{
	return _sent_bytes;
}

uint64_t MulticastSocketBuffer::GetReceiveBytes()
{
	return _receive_bytes;
}

};