Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ set(QSP_SOURCES
qsp/bindings/default/qsp_default.h
qsp/bindings/java/java_callbacks.c
qsp/bindings/java/java_control.c
qsp/bindings/java/java_files.c
qsp/bindings/java/qsp_java.h
qsp/bindings/qsp.h
qsp/actions.c qsp/actions.h
Expand Down
7 changes: 7 additions & 0 deletions qsp/bindings/java/QSPLib.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,16 @@ public class ErrorInfo {
public native boolean execUserInput(boolean toRefreshUI);
public native ErrorInfo getLastErrorData();
public native String getErrorDesc(int errorNum);

public native boolean loadGameWorldFromData(byte[] data, boolean isNewGame);
public native boolean loadGameWorldFromFD(int fileDescriptor, boolean isNewGame);

public native byte[] saveGameAsData(boolean toRefreshUI);
public native boolean saveGameByFD(int fileDescriptor, boolean toRefreshUI);

public native boolean openSavedGameFromData(byte[] data, boolean toRefreshUI);
public native boolean openSavedGameFromFD(int fileDescriptor, boolean toRefreshUI);

public native boolean restartGame(boolean toRefreshUI);

// Callbacks
Expand Down
24 changes: 24 additions & 0 deletions qsp/bindings/java/com_libqsp_jni_QSPLib.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

58 changes: 58 additions & 0 deletions qsp/bindings/java/java_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,64 @@ JNIEXPORT jstring JNICALL Java_com_libqsp_jni_QSPLib_getErrorDesc(JNIEnv *env, j
/* ------------------------------------------------------------ */
/* Game controls */

#ifdef __ANDROID__

#include <unistd.h>

/* Loading a new game from FileDescriptor */
JNIEXPORT jboolean JNICALL Java_com_libqsp_jni_QSPLib_loadGameWorldFromFD(JNIEnv *env, jobject api, jint fileDescriptor, jboolean isNewGame)
{
if (fileDescriptor < 0) return QSP_FALSE;
const int native_fd = dup(fileDescriptor);
if (native_fd < 0) return QSP_FALSE;
FILE *f = fdopen(native_fd, "rb");
if (f == NULL)
{
close(native_fd);
return QSP_FALSE;
}
QSP_BOOL res = qspOpenQuestFromFILE(f, isNewGame);
fclose(f);
return res;
}
/* Saving state by FileDescriptor */
JNIEXPORT jboolean JNICALL Java_com_libqsp_jni_QSPLib_saveGameByFD(JNIEnv *env, jobject api, jint fileDescriptor, jboolean toRefreshUI)
{
if (fileDescriptor < 0) return QSP_FALSE;
const int native_fd = dup(fileDescriptor);
if (native_fd < 0) return QSP_FALSE;
FILE *f = fdopen(native_fd, "wb");
if (!f) {
close(native_fd);
return QSP_FALSE;
}
qspPrepareExecution(QSP_FALSE);
QSP_BOOL res = qspSaveGameStatusToFILE(f);
fclose(f);
if (toRefreshUI) qspCallRefreshInt(QSP_FALSE);
return res;
}
/* Loading state from FileDescriptor */
JNIEXPORT jboolean JNICALL Java_com_libqsp_jni_QSPLib_openSavedGameFromFD(JNIEnv *env, jobject api, jint fileDescriptor, jboolean toRefreshUI)
{
if (fileDescriptor < 0) return QSP_FALSE;
const int native_fd = dup(fileDescriptor);
if (native_fd < 0) return QSP_FALSE;
FILE *f = fdopen(native_fd, "rb");
if (!f)
{
close(native_fd);
return QSP_FALSE;
}
qspPrepareExecution(QSP_FALSE);
QSP_BOOL res = qspOpenGameStatusFromFILE(f);
fclose(f);
if (!res) return JNI_FALSE;
if (qspErrorNum) return JNI_FALSE;
if (toRefreshUI) qspCallRefreshInt(QSP_FALSE);
return JNI_TRUE;
}
#endif
/* Load game from data */
JNIEXPORT jboolean JNICALL Java_com_libqsp_jni_QSPLib_loadGameWorldFromData(JNIEnv *env, jobject api, jbyteArray data, jboolean isNewGame)
{
Expand Down
76 changes: 76 additions & 0 deletions qsp/bindings/java/java_files.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include "../../declarations.h"

#ifdef _JAVA_BINDING

#include "../../errors.h"
#include "../../game.h"

QSP_BOOL qspOpenQuestFromFILE(FILE *f, const QSP_BOOL isNewGame)
{
fseek(f, 0, SEEK_END);
const int fileSize = ftell(f);

char *buf = malloc(fileSize);
if (buf == NULL) return QSP_FALSE;

fseek(f, 0, SEEK_SET);
fread(buf, 1, fileSize, f);

QSP_BOOL res = qspOpenGame(buf, fileSize, isNewGame);
free(buf);

return res;
}

QSP_BOOL qspOpenGameStatusFromFILE(FILE *f)
{
fseek(f, 0, SEEK_END);
const int fileSize = ftell(f);

char *buf = malloc(fileSize);
if (buf == NULL) return QSP_FALSE;

fseek(f, 0, SEEK_SET);
fread(buf, 1, fileSize, f);

QSP_BOOL res = qspOpenGameStatus(buf, fileSize);
free(buf);

return res;
}

QSP_BOOL qspSaveGameStatusToFILE(FILE *f)
{
void *dataBuf;
int dataBufSize = 64 * 1024;
QSP_BOOL res = QSP_FALSE;

dataBuf = malloc(dataBufSize);
if (dataBuf == NULL) return QSP_FALSE;

while (1)
{
if (qspSaveGameStatus(dataBuf, &dataBufSize, QSP_TRUE))
{
res = QSP_TRUE;
break;
}
if (!dataBufSize)
{
free(dataBuf);
return QSP_FALSE;
}
dataBufSize += QSP_SAVEDGAMEDATAEXTRASPACE;
dataBuf = realloc(dataBuf, dataBufSize);
}

if (res)
{
fwrite(dataBuf, 1, dataBufSize, f);
}

free(dataBuf);
return res;
}

#endif
4 changes: 4 additions & 0 deletions qsp/bindings/java/qsp_java.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,8 @@
JNIListItem qspToJavaObjectItem(JNIEnv *env, QSPString name, QSPString title, QSPString image);
void qspReleaseJavaListItem(JNIEnv *env, JNIListItem *listItem);

QSP_BOOL qspOpenQuestFromFILE(FILE *, QSP_BOOL);
QSP_BOOL qspSaveGameStatusToFILE(FILE *);
QSP_BOOL qspOpenGameStatusFromFILE(FILE *);

#endif