diff options
Diffstat (limited to 'backends/platform/ps2/rawsavefile.cpp')
-rw-r--r-- | backends/platform/ps2/rawsavefile.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/backends/platform/ps2/rawsavefile.cpp b/backends/platform/ps2/rawsavefile.cpp new file mode 100644 index 0000000000..03270ea9ce --- /dev/null +++ b/backends/platform/ps2/rawsavefile.cpp @@ -0,0 +1,157 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "backends/platform/ps2/rawsavefile.h" +#include "backends/platform/ps2/savefilemgr.h" + +RawReadFile::RawReadFile(McAccess *mcAccess) { + _mcAccess = mcAccess; + _size = -1; + _pos = 0; + _buf = NULL; +} + +RawReadFile::~RawReadFile(void) { + if (_buf) + free(_buf); +} + +bool RawReadFile::bufOpen(const char *path) { + int handle = _mcAccess->open(path, O_RDONLY); + printf("RawReadFile Open: \"%s\" => %d\n", path, handle); + if (handle >= 0) { + _size = _mcAccess->size(handle); + _buf = (uint8 *)memalign(64, _size); + int res = _mcAccess->read(handle, _buf, _size); + if (res != _size) { + free(_buf); + _size = -1; + _buf = NULL; + } + _mcAccess->close(handle); + } else { + _size = -1; + _buf = NULL; + } + _pos = 0; + return (_buf != NULL); +} + +int RawReadFile::bufTell(void) const { + return _pos; +} + +int RawReadFile::bufSeek(int ofs, int whence) { + switch (whence) { + case SEEK_SET: + _pos = ofs; + break; + case SEEK_CUR: + _pos += ofs; + break; + case SEEK_END: + _pos = _size + ofs; + break; + } + if (_pos < 0) + _pos = 0; + else if (_pos > _size) + _pos = _size; + return _pos; +} + +int RawReadFile::bufRead(void *dest, int size) { + if (_pos + size > _size) + size = _size - _pos; + memcpy(dest, _buf + _pos, size); + _pos += size; + return size; +} + +int RawReadFile::bufSize(void) const { + return _size; +} + + + +RawWriteFile::RawWriteFile(McAccess *mcAccess) { + _mcAccess = mcAccess; + _size = 64 * 1024; + + _buf = (uint8 *)memalign(64, _size); + _pos = 0; + _handle = -1; +} + +RawWriteFile::~RawWriteFile() { + if (_pos != 0) { + printf("RawWriteFile d'tor: file wasn't flushed!\n"); + bufFlush(); + } + free(_buf); + if (_handle >= 0) + _mcAccess->close(_handle); +} + +bool RawWriteFile::bufOpen(const char *path) { + _handle = _mcAccess->open(path, O_WRONLY | O_CREAT); + strcpy(_filename, path); + return (_handle >= 0); +} + +void RawWriteFile::bufWrite(const void *buf, int len) { + while (_pos + len > _size) { + _size = _size * 2; + _buf = (uint8 *)realloc(_buf, _size); + } + memcpy(_buf + _pos, buf, len); + _pos += len; +} + +bool RawWriteFile::bufFlush(void) { + int result = _mcAccess->write(_handle, _buf, _pos); + if (_pos != result) { + if (result > 0) { + memmove(_buf, _buf + result, _pos - result); + _pos -= result; + } + return false; + } + _pos = 0; + return true; +} + +int RawWriteFile::bufTell(void) const { + return _pos; +} + +void RawWriteFile::removeFile(void) { + if (_handle >= 0) + _mcAccess->close(_handle); + _handle = -1; + _pos = 0; + + _mcAccess->remove(_filename); +} |