PS2: Add new PS2FileStream class for std I/O.

* Add new class PS2FileStream as substitute for class StdioStream on PS2
* Remove PS2 specific hacks from stdiostream.cpp / class StdioStream
* Remove various ps2_f*() wrapper funcs, merging them into PS2FileStream

TODO: Merge class Ps2File into PS2FileStream

svn-id: r46111
This commit is contained in:
Max Horn 2009-11-23 23:17:50 +00:00
parent 9b8c088af5
commit fc84e258b2
5 changed files with 97 additions and 84 deletions

View file

@ -23,11 +23,9 @@
*/
#include "backends/fs/abstract-fs.h"
#include "backends/fs/stdiostream.h"
#include <kernel.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "backends/platform/ps2/asyncfio.h"
#include "backends/platform/ps2/fileio.h"
#include "backends/platform/ps2/systemps2.h"
@ -504,10 +502,10 @@ const char *Ps2FilesystemNode::getDeviceDescription() const {
}
Common::SeekableReadStream *Ps2FilesystemNode::createReadStream() {
Common::SeekableReadStream *ss = StdioStream::makeFromPath(getPath().c_str(), false);
Common::SeekableReadStream *ss = PS2FileStream::makeFromPath(getPath().c_str(), false);
return ss;
}
Common::WriteStream *Ps2FilesystemNode::createWriteStream() {
return StdioStream::makeFromPath(getPath().c_str(), true);
return PS2FileStream::makeFromPath(getPath().c_str(), true);
}

View file

@ -25,30 +25,6 @@
#include "backends/fs/stdiostream.h"
#ifdef __PLAYSTATION2__
// for those replaced fopen/fread/etc functions
#include "backends/platform/ps2/fileio.h"
#define fopen(a, b) ps2_fopen(a, b)
#define fclose(a) ps2_fclose(a)
#define fseek(a, b, c) ps2_fseek(a, b, c)
#define ftell(a) ps2_ftell(a)
#define feof(a) ps2_feof(a)
#define fread(a, b, c, d) ps2_fread(a, b, c, d)
#define fwrite(a, b, c, d) ps2_fwrite(a, b, c, d)
#define fflush(a) ps2_fflush(a) // used in common/util.cpp
#define ferror(a) ps2_ferror(a)
#define clearerr(a) ps2_clearerr(a)
//#define fgetc(a) ps2_fgetc(a) // not used
//#define fgets(a, b, c) ps2_fgets(a, b, c) // not used
//#define fputc(a, b) ps2_fputc(a, b) // not used
//#define fputs(a, b) ps2_fputs(a, b) // not used
//#define fsize(a) ps2_fsize(a) // not used -- and it is not a standard function either
#endif
StdioStream::StdioStream(void *handle) : _handle(handle) {
assert(handle);
}

View file

@ -43,7 +43,7 @@
AsyncFio fio;
Ps2File::Ps2File(void) {
Ps2File::Ps2File() {
_fd = -1;
_fileSize = 0;
_filePos = 0;
@ -70,7 +70,7 @@ Ps2File::Ps2File(void) {
#endif
}
Ps2File::~Ps2File(void) {
Ps2File::~Ps2File() {
uint32 w;
if (_fd >= 0) {
@ -177,7 +177,7 @@ bool Ps2File::open(const char *name, int mode) {
#endif
}
int32 Ps2File::tell(void) {
int32 Ps2File::tell() {
#ifdef __PS2_FILE_SEMA__
WaitSema(_sema);
#endif
@ -188,7 +188,7 @@ int32 Ps2File::tell(void) {
return res;
}
int32 Ps2File::size(void) {
int32 Ps2File::size() {
#ifdef __PS2_FILE_SEMA__
WaitSema(_sema);
#endif
@ -199,7 +199,7 @@ int32 Ps2File::size(void) {
return res;
}
bool Ps2File::eof(void) {
bool Ps2File::eof() {
#ifdef __PS2_FILE_SEMA__
WaitSema(_sema);
#endif
@ -213,7 +213,7 @@ bool Ps2File::eof(void) {
return res;
}
bool Ps2File::getErr(void) {
bool Ps2File::getErr() {
return _err;
}
@ -265,7 +265,7 @@ int Ps2File::seek(int32 offset, int origin) {
return res;
}
void Ps2File::cacheReadAhead(void) {
void Ps2File::cacheReadAhead() {
if (_cacheOpRunning) {
// there's already some cache read running
if (fio.poll(_fd)) // did it finish?
@ -321,7 +321,7 @@ void Ps2File::cacheReadAhead(void) {
}
}
void Ps2File::cacheReadSync(void) {
void Ps2File::cacheReadSync() {
if (_cacheOpRunning) {
int res = fio.sync(_fd);
assert(res >= 0);
@ -429,6 +429,19 @@ uint32 Ps2File::write(const void *src, uint32 len) {
return len;
}
PS2FileStream *PS2FileStream::makeFromPath(const Common::String &path, bool writeMode) {
FILE *handle = ps2_fopen(path.c_str(), writeMode ? "wb" : "rb");
if (handle)
return new PS2FileStream(handle);
return 0;
}
PS2FileStream::PS2FileStream(FILE *handle) : _handle(handle) {
assert(handle);
}
FILE *ps2_fopen(const char *fname, const char *mode) {
Ps2File *file = new Ps2File();
int _mode = O_RDONLY;
@ -448,6 +461,10 @@ FILE *ps2_fopen(const char *fname, const char *mode) {
return NULL;
}
PS2FileStream::~PS2FileStream() {
ps2_fclose(_handle);
}
int ps2_fclose(FILE *stream) {
Ps2File *file = (Ps2File*)stream;
@ -456,16 +473,20 @@ int ps2_fclose(FILE *stream) {
return 0;
}
int ps2_fseek(FILE *stream, long offset, int origin) {
return ((Ps2File*)stream)->seek(offset, origin);
bool PS2FileStream::seek(int32 offs, int whence) {
return ((Ps2File*)_handle)->seek(offs, whence) == 0;
}
uint32 ps2_ftell(FILE *stream) {
return ((Ps2File*)stream)->tell();
int32 PS2FileStream::pos() const {
return ((Ps2File*)_handle)->tell();
}
int ps2_feof(FILE *stream) {
return ((Ps2File*)stream)->eof();
bool PS2FileStream::eos() const {
return ((Ps2File*)_handle)->eof();
}
uint32 PS2FileStream::read(void *ptr, uint32 len) {
return ps2_fread((byte *)ptr, 1, len, _handle);
}
size_t ps2_fread(void *buf, size_t r, size_t n, FILE *stream) {
@ -473,12 +494,8 @@ size_t ps2_fread(void *buf, size_t r, size_t n, FILE *stream) {
return ((Ps2File*)stream)->read(buf, r * n) / r;
}
int ps2_fgetc(FILE *stream) {
uint8 temp;
if (((Ps2File*)stream)->read(&temp, 1))
return temp;
else
return EOF;
uint32 PS2FileStream::write(const void *ptr, uint32 len) {
return ps2_fwrite(ptr, 1, len, _handle);
}
size_t ps2_fwrite(const void *buf, size_t r, size_t n, FILE *stream) {
@ -486,13 +503,6 @@ size_t ps2_fwrite(const void *buf, size_t r, size_t n, FILE *stream) {
return ((Ps2File*)stream)->write(buf, r * n) / r;
}
int ps2_fputc(int c, FILE *stream) {
if (((Ps2File*)stream)->write(&c, 1) == 1)
return c;
else
return -1;
}
int ps2_fputs(const char *s, FILE *stream) {
int len = strlen(s);
@ -508,21 +518,29 @@ int ps2_fputs(const char *s, FILE *stream) {
return EOF;
}
bool PS2FileStream::flush() {
return ps2_fflush(_handle) == 0;
}
int ps2_fflush(FILE *stream) {
// printf("fflush not implemented\n");
return 0;
}
int ps2_ferror(FILE *stream) {
int err = ((Ps2File*)stream)->getErr();
bool PS2FileStream::err() const {
int errVal = ((Ps2File*)_handle)->getErr();
if (err) {
printf("ferror -> %d\n", err);
if (errVal) {
printf("ferror -> %d\n", errVal);
}
return err;
return errVal != 0;
}
void ps2_clearerr(FILE *stream) {
((Ps2File*)stream)->setErr(false);
void PS2FileStream::clearErr() {
((Ps2File*)_handle)->setErr(false);
}
int32 PS2FileStream::size() const {
return ((Ps2File*)_handle)->size();
}

View file

@ -26,8 +26,11 @@
#ifndef __PS2FILE_IO__
#define __PS2FILE_IO__
#include <stdio.h>
#include <stdio.h> // FIXME: Only for FILE -- get rid of this!
#include "common/scummsys.h"
#include "common/noncopyable.h"
#include "common/stream.h"
enum {
CACHE_SIZE = 2048 * 32,
@ -43,22 +46,22 @@ enum {
// See also StdioStream.
class Ps2File {
public:
Ps2File(void);
virtual ~Ps2File(void);
Ps2File();
virtual ~Ps2File();
virtual bool open(const char *name, int mode);
virtual uint32 read(void *dest, uint32 len);
virtual uint32 write(const void *src, uint32 len);
virtual int32 tell(void);
virtual int32 size(void);
virtual int32 tell();
virtual int32 size();
virtual int seek(int32 offset, int origin);
virtual bool eof(void);
virtual bool getErr(void);
virtual bool eof();
virtual bool getErr();
virtual void setErr(bool);
private:
void cacheReadAhead(void);
void cacheReadSync(void);
void cacheReadAhead();
void cacheReadSync();
int _fd;
uint32 _mode;
@ -83,23 +86,42 @@ private:
bool _stream;
};
// TODO: Merge Ps2File into PS2FileStream
class PS2FileStream : public Common::SeekableReadStream, public Common::WriteStream, public Common::NonCopyable {
protected:
/** File handle to the actual file. */
FILE *_handle;
public:
/**
* Given a path, invokes fopen on that path and wrap the result in a
* PS2FileStream instance.
*/
static PS2FileStream *makeFromPath(const Common::String &path, bool writeMode);
PS2FileStream(FILE *handle);
virtual ~PS2FileStream();
virtual bool err() const;
virtual void clearErr();
virtual bool eos() const;
virtual uint32 write(const void *dataPtr, uint32 dataSize);
virtual bool flush();
virtual int32 pos() const;
virtual int32 size() const;
virtual bool seek(int32 offs, int whence = SEEK_SET);
virtual uint32 read(void *dataPtr, uint32 dataSize);
};
// TODO: Get rid of the following, instead use PS2FileStream directly.
FILE *ps2_fopen(const char *fname, const char *mode);
int ps2_fclose(FILE *stream);
int ps2_fflush(FILE *stream);
int ps2_fseek(FILE *stream, long offset, int origin);
uint32 ps2_ftell(FILE *stream);
int ps2_feof(FILE *stream);
size_t ps2_fread(void *buf, size_t r, size_t n, FILE *stream);
int ps2_fgetc(FILE *stream);
char *ps2_fgets(char *buf, int n, FILE *stream);
size_t ps2_fwrite(const void *buf, size_t r, size_t n, FILE *stream);
int ps2_fputc(int c, FILE *stream);
int ps2_fputs(const char *s, FILE *stream);
int ps2_ferror(FILE *stream);
void ps2_clearerr(FILE *stream);
#endif // __PS2FILE_IO__

View file

@ -955,8 +955,7 @@ void OSystem_PS2::makeConfigPath() {
ps2_fwrite(buf, size, 1, dst);
ps2_fclose(dst);
sprintf(path, "mc0:ScummVM/ScummVM.ini");
}
else {
} else {
sprintf(path, "cdfs:ScummVM.ini");
}