From 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 Mon Sep 17 00:00:00 2001 From: Constantin Jucovschi Date: Fri, 24 Apr 2009 07:20:22 -0400 Subject: Initial commit --- network/akgnet_commbuffer.cc | 190 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 network/akgnet_commbuffer.cc (limited to 'network/akgnet_commbuffer.cc') diff --git a/network/akgnet_commbuffer.cc b/network/akgnet_commbuffer.cc new file mode 100644 index 0000000..3c5c561 --- /dev/null +++ b/network/akgnet_commbuffer.cc @@ -0,0 +1,190 @@ +/* +* This file is part of rasdaman community. +* +* Rasdaman community 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 3 of the License, or +* (at your option) any later version. +* +* Rasdaman community 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 rasdaman community. If not, see . +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see +* or contact Peter Baumann via . +/ +/** + * SOURCE: akgnet_commbuffer.cc + * + * MODULE: akg network + * CLASS: CommBuffer + * + * COMMENTS: + * + */ + +#include +#include +#include + + +akg::CommBuffer::CommBuffer() throw() + { + data = NULL; + buffSize = 0; + fillSize = 0; + sendSize = 0; + allocated= false; + } + +akg::CommBuffer::CommBuffer(int size) throw() + { + assert(size > 0); + allocate(size); + } + +akg::CommBuffer::CommBuffer(void *externalBuffer,int totalSize, int dataSize) throw() + { + data = NULL; + takeOver(externalBuffer,totalSize,dataSize); + } + +akg::CommBuffer::~CommBuffer() throw() + { + freeBuffer(); + } + +bool akg::CommBuffer::allocate(int size) throw() + { + assert(size > 0); + + freeBuffer(); + data = new char[size]; + // new throws? + buffSize=size; + allocated=true; + return true; + } + +void akg::CommBuffer::freeBuffer() throw() + { + if(allocated == true && data != NULL) delete[] data; + data = NULL; + buffSize = 0; + fillSize = 0; + sendSize = 0; + allocated= false; + } + +void akg::CommBuffer::takeOver(void *externalBuffer,int totalSize, int dataSize) throw() + { + assert(externalBuffer != 0); + assert(totalSize > 0); + assert(dataSize >= 0); + assert(totalSize >= dataSize); + + freeBuffer(); + data = (char*)externalBuffer; + buffSize = totalSize; + fillSize = dataSize; + } + +bool akg::CommBuffer::resize(int newSize) throw() + { + assert(data != 0); + + // we can't make the buffer smaller by truncating inside data! + if(newSize < fillSize) return false; + + char *newData = new char[newSize]; + memcpy(newData, data, fillSize); + if(allocated == true ) delete[] data; + + data = newData; + buffSize = newSize; + allocated = true; + return true; + } + +void* akg::CommBuffer::getData() throw(){ return data;} +int akg::CommBuffer::getDataSize() throw(){ return fillSize;} +int akg::CommBuffer::getBufferSize() throw(){ return buffSize;} +int akg::CommBuffer::getSendedSize() throw(){ return sendSize;} +int akg::CommBuffer::getNotFilledSize() throw(){ return buffSize-fillSize;} +int akg::CommBuffer::getNotSendedSize() throw(){ return fillSize-sendSize;} +bool akg::CommBuffer::isAllocated() throw(){ return allocated;} + +int akg::CommBuffer::read(FileDescriptor &socket) throw() + { + int rasp = socket.read(data+fillSize,buffSize-fillSize); + + if(rasp>=0) fillSize += rasp; + + return rasp; + } + +int akg::CommBuffer::read(const void *externalBuffer,int size) throw() + { + assert(externalBuffer != 0); + assert(size >= 0); + + int cpSize = size<(buffSize-fillSize) ? size:(buffSize-fillSize); + + memcpy(data+fillSize,externalBuffer,cpSize); + fillSize += cpSize; + + return cpSize; + } + +int akg::CommBuffer::reserve(int size) throw() + { + assert(size >= 0); + + int cpSize = size<(buffSize-fillSize) ? size:(buffSize-fillSize); + + fillSize += cpSize; + + return cpSize; + } + +int akg::CommBuffer::write(FileDescriptor &socket) throw() + { + DBTALK("CommBuffer write fillSize="<