Added more functions to JS File object.

This commit is contained in:
harry 2024-02-18 21:10:24 -05:00
parent 72b297980b
commit 2f2279f5ff
3 changed files with 246 additions and 15 deletions

View File

@ -126,6 +126,11 @@ FileScriptObject::~FileScriptObject()
//printf("FileScriptObject %p Destructor: %i\n", this, numInstances); //printf("FileScriptObject %p Destructor: %i\n", this, numInstances);
} }
//---------------------------------------------------- //----------------------------------------------------
void FileScriptObject::setTemporary(bool value)
{
tmp = value;
}
//----------------------------------------------------
void FileScriptObject::setFilePath(const QString& path) void FileScriptObject::setFilePath(const QString& path)
{ {
if (isOpen()) if (isOpen())
@ -161,7 +166,14 @@ bool FileScriptObject::open(int mode)
return false; return false;
} }
if (tmp)
{
file = new QTemporaryFile();
}
else
{
file = new QFile(filepath); file = new QFile(filepath);
}
if (file == nullptr) if (file == nullptr)
{ {
@ -184,6 +196,10 @@ bool FileScriptObject::open(int mode)
{ {
deviceMode |= QIODevice::Append; deviceMode |= QIODevice::Append;
} }
if (mode & Truncate)
{
deviceMode |= QIODevice::Truncate;
}
bool success = file->open(deviceMode); bool success = file->open(deviceMode);
@ -203,6 +219,116 @@ bool FileScriptObject::isOpen()
return flag; 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() void FileScriptObject::close()
{ {
if (file != nullptr) if (file != nullptr)
@ -211,6 +337,10 @@ void FileScriptObject::close()
{ {
file->close(); file->close();
} }
if (tmp)
{
file->remove();
}
delete file; delete file;
file = nullptr; file = nullptr;
} }
@ -229,30 +359,112 @@ int FileScriptObject::writeString(const QString& s)
return bytesWritten; 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()) if ( (file == nullptr) || !file->isOpen())
{ {
auto* engine = FCEU::JSEngine::getCurrent(); auto* engine = FCEU::JSEngine::getCurrent();
engine->throwError(QJSValue::GenericError, "file is not open "); engine->throwError(QJSValue::GenericError, "file is not open ");
return obj; return line;
} }
auto* engine = FCEU::JSEngine::getCurrent();
QByteArray byteArray = file->readLine(); QByteArray byteArray = file->readLine();
QString line = QString::fromLocal8Bit(byteArray); line = QString::fromLocal8Bit(byteArray);
//printf("ReadLine: %s\n", line.toLocal8Bit().constData()); //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); auto* engine = FCEU::JSEngine::getCurrent();
obj.setProperty("size", static_cast<int>(line.size()));
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 //---- Joypad Object

View File

@ -124,13 +124,15 @@ public:
ReadOnly = 0x01, ReadOnly = 0x01,
WriteOnly = 0x02, WriteOnly = 0x02,
ReadWrite = 0x03, ReadWrite = 0x03,
Append = 0x04 Append = 0x04,
Truncate = 0x08
}; };
Q_ENUM(Mode); Q_ENUM(Mode);
private: private:
static int numInstances; static int numInstances;
QString filepath; QString filepath;
bool tmp = false;
QFile *file = nullptr; QFile *file = nullptr;
@ -138,12 +140,29 @@ public slots:
Q_INVOKABLE bool open(int mode = ReadOnly); Q_INVOKABLE bool open(int mode = ReadOnly);
Q_INVOKABLE void close(); Q_INVOKABLE void close();
Q_INVOKABLE bool isOpen(); 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 void setFilePath(const QString& path);
Q_INVOKABLE QString fileName(); Q_INVOKABLE QString fileName();
Q_INVOKABLE QString fileSuffix(); Q_INVOKABLE QString fileSuffix();
Q_INVOKABLE QString filePath(){ return filepath; } 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 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 class JoypadScriptObject: public QObject

View File

@ -1298,7 +1298,7 @@ int KillJoysticks(void)
{ {
jsDev[n].close(); 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); SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
s_jinited = 0; s_jinited = 0;
@ -1421,7 +1421,7 @@ int InitJoysticks(void)
{ {
return 1; 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); SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
total = SDL_NumJoysticks(); total = SDL_NumJoysticks();