Skip to content

Commit

Permalink
electrofs.js sends full system paths, so store those paths and then s…
Browse files Browse the repository at this point in the history
…end a fake filename to Remglk
  • Loading branch information
curiousdannii committed Aug 25, 2020
1 parent 0a8d76f commit 970a7ca
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 8 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "emglken",
"version": "0.3.0",
"version": "0.3.1",
"description": "Glk meets Emscripten",
"author": "Dannii Willis <[email protected]>",
"license": "GPL-2.0",
Expand Down
34 changes: 30 additions & 4 deletions src/emglkenfs.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ module.exports = class EmglkenFS
this.streaming = this.dialog.streaming
this.FS = VM.Module.FS
this.VM = VM

this.filename_map = {}
this.filename_counter = 0
}

close(stream)
Expand Down Expand Up @@ -175,7 +178,8 @@ module.exports = class EmglkenFS
{
if (name !== 'storyfile')
{
if (!this.dialog.file_ref_exists(this.streaming ? {filename: name} : this.get_dialog_ref(name)))
const realname = this.filename_map[name] || name
if (!this.dialog.file_ref_exists(this.streaming ? {filename: realname} : this.get_dialog_ref(realname)))
{
throw new this.FS.ErrnoError(ENOENT)
}
Expand Down Expand Up @@ -213,13 +217,14 @@ module.exports = class EmglkenFS
else
{
const fmode = convert_flags(stream.flags)
const realname = this.filename_map[stream.name] || name
if (this.streaming)
{
stream.fstream = this.dialog.file_fopen(fmode, {filename: stream.name})
stream.fstream = this.dialog.file_fopen(fmode, {filename: realname})
}
else
{
stream.fref = this.get_dialog_ref(stream.name)
stream.fref = this.get_dialog_ref(realname)
stream.fmode = fmode

// Read the content if not overwriting
Expand Down Expand Up @@ -286,6 +291,26 @@ module.exports = class EmglkenFS
throw new Error('EmglkenFS.readlink')
}

// electrofs.js will give a full system path, which we can't handle. So store the full path and return a fake file name
register_filename(filename, usage)
{
const suffix = usage === 'save' ? '.glksave' : (usage === 'data' ? '.glkdata' : '.txt')
if (!/\.(glkdata|glksave|txt)$/.test(filename))
{
filename = filename + suffix
}

if (this.filename_map[filename])
{
return this.filename_map[filename]
}

const fakename = 'emglken_fake_file_' + this.filename_counter++
this.filename_map[filename] = fakename
this.filename_map[fakename + suffix] = filename
return fakename
}

rename()
{
throw new Error('EmglkenFS.rename')
Expand All @@ -309,7 +334,8 @@ module.exports = class EmglkenFS

unlink(parent, name)
{
this.dialog.file_remove_ref(this.get_dialog_ref(name))
const realname = this.filename_map[name] || name
this.dialog.file_remove_ref(this.get_dialog_ref(realname))
}

write(stream, buffer, offset, length, position)
Expand Down
12 changes: 10 additions & 2 deletions src/vm.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,18 @@ module.exports = class EmglkenVM
this.Module = Module

this.options.accept = data => {
// Convert a Dialog.js provided fileref into something Remglk will understand
if (data.type === 'specialresponse' && data.response === 'fileref_prompt' && data.value)
{
data.value = data.value.filename
// electrofs.js returns a full path, so register it with EmglkenFS, and return a fake filename
if (this.EFS.streaming)
{
data.value = this.EFS.register_filename(data.value.filename, data.value.usage)
}
// Convert a dialog.js provided fileref into something Remglk can understand
else
{
data.value = data.value.filename
}
}

const json_data = JSON.stringify(data)
Expand Down
2 changes: 1 addition & 1 deletion versions.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"emglken": "0.3.0",
"emglken": "0.3.1",
"git": "1.3.5",
"glulxe": "0.5.4",
"hugo": "3.1.05",
Expand Down

0 comments on commit 970a7ca

Please sign in to comment.