From: Christian P. <cp...@us...> - 2005-01-03 13:50:58
|
Update of /cvsroot/pclasses/pclasses2/src/IO In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19210/src/IO Modified Files: IODevice.cpp Added Files: IOFilter.cpp Log Message: Added IOFilter support to IODevice. Updated classes that inherit from IODevice. Fixed some minor bugs in ProcessIO class. Index: IODevice.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/IO/IODevice.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- IODevice.cpp 30 Dec 2004 19:36:48 -0000 1.3 +++ IODevice.cpp 3 Jan 2005 13:50:44 -0000 1.4 @@ -19,59 +19,145 @@ ***************************************************************************/ #include "pclasses/IO/IODevice.h" - +#include "pclasses/IO/IOFilter.h" + namespace P { namespace IO { IODevice::IODevice() throw() -: _valid(false), _access(None), _eof(true) +: _filter(0), _filterOwner(false), _valid(false), _access(None), _eof(true) { } IODevice::IODevice(const IODevice& dev) throw() -: _valid(dev._valid), _access(dev._access), _eof(dev._eof) +: _filter(0), _filterOwner(false), _valid(dev._valid), _access(dev._access), + _eof(dev._eof) { + if(dev._filter) + { + _filter = dev._filter->create(); + _filter->setDevice(this); + _filterOwner = true; + } } IODevice::~IODevice() throw() { + if(_filterOwner) + delete _filter; } -IODevice::AccessMode IODevice::access() const throw() +void IODevice::close() throw(IOError) { - return _access; + if(valid()) + { + if(_filter) + _filter->sync(); + + _close(); + } } -size_t IODevice::peek(char* buffer, size_t count) throw(IOError) +size_t IODevice::read(char* buffer, size_t count) throw(IOError) { - return 0; + return _filter ? _filter->read(buffer, count) : _read(buffer, count); +} + +size_t IODevice::write(const char* buffer, size_t count) throw(IOError) +{ + return _filter ? _filter->write(buffer, count) : _write(buffer, count); } bool IODevice::isSeekable() const throw() { - return false; + return _filter ? _filter->isSeekable() : _isSeekable(); } offset_t IODevice::seek(offset_t offset, SeekMode mode) throw(IOError) { - throw IOError(0, "Could not seek on device", P_SOURCEINFO); + return _filter ? _filter->seek(offset, mode) : _seek(offset, mode); } -offset_t IODevice::getPos() throw(IOError) +size_t IODevice::peek(char* buffer, size_t count) throw(IOError) { - return seek(0, SeekCurrent); + return _filter ? _filter->peek(buffer, count) : _peek(buffer, count); } void IODevice::sync() const throw(IOError) { + if(_filter) + _filter->sync(); + + _sync(); +} + +offset_t IODevice::getPos() throw(IOError) +{ + return seek(0, SeekCurrent); } offset_t IODevice::size() const throw(IOError) { + return _filter ? _filter->size() : _size(); +} + +void IODevice::setFilter(IOFilter* f) throw(LogicError) +{ + // it took me 1 hour to find out why the Pipe test crashed ... + // just to get sure no one else get's into this trap... cproch + if(f && f->device()) + throw LogicError("Filter is already in use", P_SOURCEINFO); + + if(_filter) + { + _filter->setDevice(0); + + if(_filterOwner) + delete _filter; + } + + _filter = f; + _filterOwner = false; + + if(_filter) + _filter->setDevice(this); +} + +IOFilter* IODevice::filter() const throw() +{ + return _filter; +} + +size_t IODevice::_peek(char* buffer, size_t count) throw(IOError) +{ + return 0; +} + +bool IODevice::_isSeekable() const throw() +{ + return false; +} + +offset_t IODevice::_seek(offset_t offset, SeekMode mode) throw(IOError) +{ + throw IOError(0, "Could not seek on device", P_SOURCEINFO); +} + +void IODevice::_sync() const throw(IOError) +{ +} + +offset_t IODevice::_size() const throw(IOError) +{ return 0; } +IODevice::AccessMode IODevice::access() const throw() +{ + return _access; +} + bool IODevice::valid() const throw() { return _valid; @@ -111,10 +197,25 @@ IODevice& IODevice::operator=(const IODevice& dev) throw() { + if(_filterOwner) + { + delete _filter; + _filter = 0; + } + + if(dev._filter) + { + _filter = dev._filter->create(); + _filter->setDevice(this); + _filterOwner = true; + } + else + _filterOwner = false; + _valid = dev._valid; _access = dev._access; _eof = dev._eof; - return *this; + return *this; } --- NEW FILE: IOFilter.cpp --- /*************************************************************************** * Copyright (C) 2004 by Christian Prochnow * * cp...@se... * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library 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 Library 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 <pclasses/IO/IOFilter.h> namespace P { namespace IO { IOFilter::IOFilter() : _dev(0) { } IOFilter::~IOFilter() { if(_dev) sync(); } void IOFilter::setDevice(IODevice* dev) { if(_dev) sync(); _dev = dev; } void IOFilter::sync() { _dev->_sync(); } IOFilter* IOFilter::create() { IOFilter* filter = new IOFilter(); return filter; } bool IOFilter::isSeekable() { return _dev->_isSeekable(); } size_t IOFilter::read(char* buffer, size_t count) throw(IO::IOError) { return _dev->_read(buffer, count); } size_t IOFilter::write(const char* buffer, size_t count) throw(IO::IOError) { return _dev->_write(buffer, count); } size_t IOFilter::peek(char* buffer, size_t count) throw(IOError) { return _dev->_peek(buffer, count); } offset_t IOFilter::seek(offset_t offset, IODevice::SeekMode mode) throw(IOError) { return _dev->_seek(offset, mode); } offset_t IOFilter::size() const throw(IOError) { return _dev->_size(); } IODevice* IOFilter::device() const throw() { return _dev; } } // !namespace IO } // !namespace P |