Exemplo n.º 1
0
 public static Session Load (FileSystemDatabase fsd, int key)
 {
     var toLoad = fsd.Read (key);
     if (toLoad == null) {
         return null;
     }
     var result = new Session ();
     result.Id = key;
     if (toLoad.ContainsKey (ShovelVmStateName)) {
         result.ShovelVmState = toLoad [ShovelVmStateName];
     }
     if (toLoad.ContainsKey (ShovelVmBytecodeName)) {
         result.ShovelVmBytecode = toLoad [ShovelVmBytecodeName];
     }
     if (toLoad.ContainsKey (ShovelVmSourcesName)) {
         result.ShovelVmSources = Encoding.UTF8.GetString (toLoad [ShovelVmSourcesName]);
     }
     if (toLoad.ContainsKey (PageContentName)) {
         result.PageContent.Append (Encoding.UTF8.GetString (toLoad [PageContentName]));
     }
     if (toLoad.ContainsKey (ReadStateName)) {
         result.ReadState = (ReadStates)BitConverter.ToInt32 (toLoad [ReadStateName], 0);
     }
     return result;
 }
Exemplo n.º 2
0
 static Session FreshSession(FileSystemDatabase fsd)
 {
     var session = new Session ();
     session.Id = fsd.GetFreshId ();
     session.ShovelVmSources = Program ();
     session.ShovelVmBytecode = Shovel.Api.SerializeBytecode (ProgramBytecode ());
     return session;
 }
Exemplo n.º 3
0
 static IEnumerable<Shovel.Callable> Udps(Session session, string userInput)
 {
     var rng = new Random ();
     Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> print = (api, args, result) =>
     {
         if (args.Length > 0 && args [0].Kind == Shovel.Value.Kinds.String) {
             session.PageContent.Append ("<span>");
             session.PageContent.Append (HttpUtility.HtmlEncode (args [0].StringValue));
             session.PageContent.Append ("</span>");
         }
     };
     Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> printLn = (api, args, result) =>
     {
         if (args.Length > 0 && args [0].Kind == Shovel.Value.Kinds.String) {
             session.PageContent.Append ("<span>");
             session.PageContent.Append (HttpUtility.HtmlEncode (args [0].StringValue));
             session.PageContent.Append ("</span><br/>");
         }
     };
     Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> readInt = (api, args, result) =>
     {
         if (session.ReadState == Session.ReadStates.None) {
             result.After = Shovel.UdpResult.AfterCall.NapAndRetryOnWakeUp;
             session.ReadState = Session.ReadStates.ReadInteger;
         } else if (session.ReadState == Session.ReadStates.ReadInteger) {
             int dummy;
             if (!int.TryParse (userInput, out dummy)) {
                 dummy = 0;
             }
             result.Result = Shovel.Value.MakeInt (dummy);
             session.ReadState = Session.ReadStates.None;
             session.PageContent.Append (HttpUtility.HtmlEncode (userInput));
             session.PageContent.Append ("<br/>");
         } else {
             throw new InvalidOperationException ();
         }
     };
     Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> readChar = (api, args, result) =>
     {
         if (session.ReadState == Session.ReadStates.None) {
             result.After = Shovel.UdpResult.AfterCall.NapAndRetryOnWakeUp;
             session.ReadState = Session.ReadStates.ReadChar;
         } else if (session.ReadState == Session.ReadStates.ReadChar) {
             var line = userInput;
             if (line.Length > 0) {
                 result.Result = Shovel.Value.Make (line.Substring (0, 1));
             } else {
                 result.Result = Shovel.Value.Make ("");
             }
             session.ReadState = Session.ReadStates.None;
             session.PageContent.Append (HttpUtility.HtmlEncode (userInput));
             session.PageContent.Append ("<br/>");
         } else {
             throw new InvalidOperationException ();
         }
     };
     Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> random = (api, args, result) =>
     {
         result.Result = Shovel.Value.MakeFloat (rng.NextDouble ());
     };
     return new Shovel.Callable[] {
         Shovel.Callable.MakeUdp ("print", print, 1),
         Shovel.Callable.MakeUdp ("printLn", printLn, 1),
         Shovel.Callable.MakeUdp ("readInt", readInt, 0),
         Shovel.Callable.MakeUdp ("readChar", readChar, 0),
         Shovel.Callable.MakeUdp ("random", random, 0),
     };
 }