From 2f2279f5ffa70e40937fb59d3dd4d785bdae4fdd Mon Sep 17 00:00:00 2001 From: harry Date: Sun, 18 Feb 2024 21:10:24 -0500 Subject: [PATCH] Added more functions to JS File object. --- src/drivers/Qt/QtScriptManager.cpp | 234 +++++++++++++++++++++++++++-- src/drivers/Qt/QtScriptManager.h | 23 ++- src/drivers/Qt/sdl-joystick.cpp | 4 +- 3 files changed, 246 insertions(+), 15 deletions(-) diff --git a/src/drivers/Qt/QtScriptManager.cpp b/src/drivers/Qt/QtScriptManager.cpp index d75df940..d85c7f15 100644 --- a/src/drivers/Qt/QtScriptManager.cpp +++ b/src/drivers/Qt/QtScriptManager.cpp @@ -126,6 +126,11 @@ FileScriptObject::~FileScriptObject() //printf("FileScriptObject %p Destructor: %i\n", this, numInstances); } //---------------------------------------------------- +void FileScriptObject::setTemporary(bool value) +{ + tmp = value; +} +//---------------------------------------------------- void FileScriptObject::setFilePath(const QString& path) { if (isOpen()) @@ -161,7 +166,14 @@ bool FileScriptObject::open(int mode) return false; } - file = new QFile(filepath); + if (tmp) + { + file = new QTemporaryFile(); + } + else + { + file = new QFile(filepath); + } if (file == nullptr) { @@ -184,6 +196,10 @@ bool FileScriptObject::open(int mode) { deviceMode |= QIODevice::Append; } + if (mode & Truncate) + { + deviceMode |= QIODevice::Truncate; + } bool success = file->open(deviceMode); @@ -203,6 +219,116 @@ bool FileScriptObject::isOpen() return flag; } //---------------------------------------------------- +bool FileScriptObject::isReadable() +{ + bool flag = false; + + if (file != nullptr) + { + flag = file->isReadable(); + } + return flag; +} +//---------------------------------------------------- +bool FileScriptObject::isWritable() +{ + bool flag = false; + + if (file != nullptr) + { + flag = file->isWritable(); + } + return flag; +} +//---------------------------------------------------- +bool FileScriptObject::atEnd() +{ + bool retval = false; + + if (file != nullptr) + { + retval = file->atEnd(); + } + return retval; +} +//---------------------------------------------------- +bool FileScriptObject::truncate() +{ + bool retval = false; + + if (file != nullptr) + { + retval = file->resize(0); + } + return retval; +} +//---------------------------------------------------- +bool FileScriptObject::resize(int64_t size) +{ + bool retval = false; + + if (file != nullptr) + { + retval = file->resize(size); + } + return retval; +} +//---------------------------------------------------- +int64_t FileScriptObject::skip(int64_t size) +{ + int64_t retval = 0; + + if (file != nullptr) + { + retval = file->skip(size); + } + return retval; +} +//---------------------------------------------------- +bool FileScriptObject::seek(int64_t pos) +{ + bool retval = false; + + if (file != nullptr) + { + retval = file->seek(pos); + } + return retval; +} +//---------------------------------------------------- +int64_t FileScriptObject::pos() +{ + int64_t retval = 0; + + if (file != nullptr) + { + retval = file->pos(); + } + return retval; +} +//---------------------------------------------------- +int64_t FileScriptObject::bytesAvailable() +{ + int64_t retval = 0; + + if (file != nullptr) + { + retval = file->bytesAvailable(); + } + return retval; +} +//---------------------------------------------------- +bool FileScriptObject::flush() +{ + bool retval = false; + + if (file != nullptr) + { + retval = file->flush(); + } + return retval; +} +//---------------------------------------------------- void FileScriptObject::close() { if (file != nullptr) @@ -211,6 +337,10 @@ void FileScriptObject::close() { file->close(); } + if (tmp) + { + file->remove(); + } delete file; file = nullptr; } @@ -229,30 +359,112 @@ int FileScriptObject::writeString(const QString& s) return bytesWritten; } //---------------------------------------------------- -QJSValue FileScriptObject::readLine() +int FileScriptObject::writeData(const QByteArray& s) { - QJSValue obj; + if ( (file == nullptr) || !file->isOpen()) + { + auto* engine = FCEU::JSEngine::getCurrent(); + engine->throwError(QJSValue::GenericError, "file is not open "); + return -1; + } + int bytesWritten = file->write( s ); + + return bytesWritten; +} +//---------------------------------------------------- +QString FileScriptObject::readLine() +{ + QString line; if ( (file == nullptr) || !file->isOpen()) { auto* engine = FCEU::JSEngine::getCurrent(); engine->throwError(QJSValue::GenericError, "file is not open "); - return obj; + return line; } - auto* engine = FCEU::JSEngine::getCurrent(); - QByteArray byteArray = file->readLine(); - QString line = QString::fromLocal8Bit(byteArray); + line = QString::fromLocal8Bit(byteArray); //printf("ReadLine: %s\n", line.toLocal8Bit().constData()); - obj = engine->newObject(); + return line; +} +//---------------------------------------------------- +QByteArray FileScriptObject::readData(unsigned int maxBytes) +{ + QJSValue arrayBuffer; + QByteArray byteArray; - obj.setProperty("text", line); - obj.setProperty("size", static_cast(line.size())); + auto* engine = FCEU::JSEngine::getCurrent(); - return obj; + if ( (file == nullptr) || !file->isOpen()) + { + engine->throwError(QJSValue::GenericError, "file is not open "); + return byteArray; + } + if (maxBytes > 0) + { + byteArray = file->read(maxBytes); + } + else + { + byteArray = file->readAll(); + } + + //arrayBuffer = engine->toScriptValue(byteArray); + + return byteArray; +} +//---------------------------------------------------- +QByteArray FileScriptObject::peekData(unsigned int maxBytes) +{ + QJSValue arrayBuffer; + QByteArray byteArray; + + auto* engine = FCEU::JSEngine::getCurrent(); + + if ( (file == nullptr) || !file->isOpen()) + { + engine->throwError(QJSValue::GenericError, "file is not open "); + return byteArray; + } + byteArray = file->peek(maxBytes); + + //arrayBuffer = engine->toScriptValue(byteArray); + + return byteArray; +} +//---------------------------------------------------- +bool FileScriptObject::putChar(char c) +{ + if ( (file == nullptr) || !file->isOpen()) + { + auto* engine = FCEU::JSEngine::getCurrent(); + engine->throwError(QJSValue::GenericError, "file is not open "); + return -1; + } + bool success = file->putChar(c); + + return success; +} +//---------------------------------------------------- +char FileScriptObject::getChar() +{ + if ( (file == nullptr) || !file->isOpen()) + { + auto* engine = FCEU::JSEngine::getCurrent(); + engine->throwError(QJSValue::GenericError, "file is not open "); + return -1; + } + char c = -1; + bool success = file->getChar(&c); + + if (!success) + { + c = -1; + } + return c; } //---------------------------------------------------- //---- Joypad Object diff --git a/src/drivers/Qt/QtScriptManager.h b/src/drivers/Qt/QtScriptManager.h index 8c0ce5ba..c481ba45 100644 --- a/src/drivers/Qt/QtScriptManager.h +++ b/src/drivers/Qt/QtScriptManager.h @@ -124,13 +124,15 @@ public: ReadOnly = 0x01, WriteOnly = 0x02, ReadWrite = 0x03, - Append = 0x04 + Append = 0x04, + Truncate = 0x08 }; Q_ENUM(Mode); private: static int numInstances; QString filepath; + bool tmp = false; QFile *file = nullptr; @@ -138,12 +140,29 @@ public slots: Q_INVOKABLE bool open(int mode = ReadOnly); Q_INVOKABLE void close(); Q_INVOKABLE bool isOpen(); + Q_INVOKABLE bool isReadable(); + Q_INVOKABLE bool isWritable(); + Q_INVOKABLE bool flush(); + Q_INVOKABLE bool atEnd(); + Q_INVOKABLE bool truncate(); + Q_INVOKABLE bool resize(int64_t size); + Q_INVOKABLE bool seek(int64_t pos); + Q_INVOKABLE int64_t pos(); + Q_INVOKABLE int64_t bytesAvailable(); + Q_INVOKABLE bool isTemporary(){ return tmp; } + Q_INVOKABLE void setTemporary(bool value); Q_INVOKABLE void setFilePath(const QString& path); Q_INVOKABLE QString fileName(); Q_INVOKABLE QString fileSuffix(); Q_INVOKABLE QString filePath(){ return filepath; } - Q_INVOKABLE QJSValue readLine(); + Q_INVOKABLE QString readLine(); + Q_INVOKABLE int64_t skip(int64_t size); + Q_INVOKABLE QByteArray readData(unsigned int maxBytes = 0); + Q_INVOKABLE QByteArray peekData(unsigned int maxSize); Q_INVOKABLE int writeString(const QString& s); + Q_INVOKABLE int writeData(const QByteArray& data); + Q_INVOKABLE bool putChar(char c); + Q_INVOKABLE char getChar(); }; class JoypadScriptObject: public QObject diff --git a/src/drivers/Qt/sdl-joystick.cpp b/src/drivers/Qt/sdl-joystick.cpp index 50dec3c8..29f6b28c 100644 --- a/src/drivers/Qt/sdl-joystick.cpp +++ b/src/drivers/Qt/sdl-joystick.cpp @@ -1298,7 +1298,7 @@ int KillJoysticks(void) { jsDev[n].close(); } - FCEU_printf("Shutting down SDL joystick/game constroller subsystem\n"); + FCEU_printf("Shutting down SDL joystick/gamepad subsystem\n"); SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); s_jinited = 0; @@ -1421,7 +1421,7 @@ int InitJoysticks(void) { return 1; } - FCEU_printf("Initializing SDL joystick/game constroller subsystem\n"); + FCEU_printf("Initializing SDL joystick/gamepad subsystem\n"); SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); total = SDL_NumJoysticks();