static void ServeSession(HttpListenerContext ctx, FileSystemDatabase fsd, Session session, string userInput)
{
var vm = Shovel.Api.RunVm (
Shovel.Api.DeserializeBytecode (session.ShovelVmBytecode),
ProgramSources (session.ShovelVmSources),
Udps (session, userInput),
session.ShovelVmState,
totalTicksQuota: null,
ticksUntilNextNapQuota: null,
usedCellsQuota: null);
if (Shovel.Api.VmProgrammingError (vm) != null) {
ServeError (ctx, session, Shovel.Api.VmProgrammingError (vm).Message);
} else if (Shovel.Api.VmUserDefinedPrimitiveError (vm) != null) {
ServeError (ctx, session, Shovel.Api.VmUserDefinedPrimitiveError (vm).Message);
} else if (Shovel.Api.VmExecutionComplete (vm)) {
using (var sw = new StreamWriter(ctx.Response.OutputStream)) {
sw.Write ("<!DOCTYPE html>\n");
sw.Write (session.PageContent.ToString ());
sw.Write ("<p>Program execution completed.</p>");
sw.Write ("<a href='/' id='restart-link'>Enter another program.</p>");
sw.Write ("<script>\n");
sw.Write ("document.getElementById('restart-link').focus()\n");
sw.Write ("</script>\n");
}
} else {
session.ShovelVmState = Shovel.Api.SerializeVmState (vm);
session.Id = fsd.GetFreshId ();
session.Save (fsd);
using (var sw = new StreamWriter(ctx.Response.OutputStream)) {
sw.Write ("<!DOCTYPE html>\n");
sw.Write (session.PageContent.ToString ());
sw.Write ("<form action='/' method='get'>");
sw.Write ("<input type='text' name='input' id='shovel-input'/>");
sw.Write ("<input type='submit' value='Submit'/>");
sw.Write (String.Format (
"<input type='hidden' name='sessionid' value='{0}' id='shovel-input'/>",
session.Id)
);
sw.Write ("</form>");
sw.Write ("<script>\n");
sw.Write ("document.getElementById('shovel-input').focus()\n");
sw.Write ("</script>\n");
}
}
ctx.Response.OutputStream.Close ();
}