private static void MaintFace_CommandReceived(object sender, CommandReceivedEventArgs e) { Console.WriteLine("Command: " + e.Command); // To Do: Process the command. e.Response = "ok"; }
private static async void CommandListener(WebSocketInfo webSocketInfo) { ArraySegment<byte> arr = new ArraySegment<byte>(new byte[1024]); CancellationToken ct = new CancellationToken(); Interlocked.Increment(ref _connectedCount); try { for (;;) { try { using (MemoryStream ms = new MemoryStream()) { for (;;) { if (webSocketInfo.Socket.State != WebSocketState.Open) return; var res = await webSocketInfo.Socket.ReceiveAsync(arr, ct); ms.Write(arr.Array, 0, res.Count); if (res.EndOfMessage) break; } var messageSerialized = System.Text.Encoding.Default.GetString(ms.ToArray()); var serializer = new JavaScriptSerializer(); var message = (ClientMessage)serializer.Deserialize(messageSerialized, typeof(ClientMessage)); if (message == null) continue; if (!string.IsNullOrEmpty(message.CustomButton)) { #pragma warning disable 4014 if (!Options.HasFlag(MaintFaceOptions.EnableButtons)) { Trace.WriteLine(nameof(MaintFace) + ": Button use is disabled."); } else { CustomButtonEvent evt; if (Buttons.TryGetEvent(message.CustomButton, out evt)) Task.Run(() => { try { evt.Trigger(message.CustomButton); } catch (Exception ex) { Trace.WriteLine(nameof(MaintFace) + " Error: " + nameof(evt.Trigger) + ": " + ex.Message); } }); } #pragma warning restore 4014 } if (!string.IsNullOrEmpty(message.Command)) { if (!Options.HasFlag(MaintFaceOptions.EnableCommands)) { Trace.WriteLine(nameof(MaintFace) + ": Command use is disabled."); } else { if (CommandReceived != null) { #pragma warning disable 4014 _consoleMessageQueue.Enqueue(">" + message.Command); var args = new CommandReceivedEventArgs(message.Command); Task.Run(() => { try { CommandReceived(null, args); } catch (Exception ex) { Trace.WriteLine(nameof(MaintFace) + " Error: " + nameof(CommandReceived) + ": " + ex.Message); } }).ContinueWith((task) => { if (args.Response != null) _consoleMessageQueue.Enqueue(args.Response); }); } } #pragma warning restore 4014 } if (message.DumpTracePointName != null) { TraceNode traceNode; if (_nodes.TryGetValue(message.DumpTracePointName, out traceNode)) { AwaitableObject<VariableDump> dumpRequest = new AwaitableObject<VariableDump>(); traceNode.VarDumpRequests.Enqueue(dumpRequest); var dump = await dumpRequest.WaitForValue(); ServerVarDumpMessage response = new ServerVarDumpMessage(); response.MessageId = message.MessageId; response.VarDump = dump; var serializedResult = serializer.Serialize(response); var buffer = Encoding.UTF8.GetBytes(serializedResult); var segment = new ArraySegment<byte>(buffer); if (webSocketInfo.Socket.State != WebSocketState.Open) return; await webSocketInfo.SendAsync(segment); } } if (message.StatOverride != null) { if (!Options.HasFlag(MaintFaceOptions.EnableVariableOverride)) { Trace.WriteLine(nameof(MaintFace) + ": Variable overrides are disabled."); } else { var counter = Stats.GetIfExists(message.StatOverride.Name); if (counter != null) counter.ValueOverride = message.StatOverride.Value; } } if (message.VarOverride != null) { if (!Options.HasFlag(MaintFaceOptions.EnableVariableOverride)) { Trace.WriteLine(nameof(MaintFace) + ": Variable overrides are disabled."); } else { TraceNode traceNode; if (_nodes.TryGetValue(message.VarOverride.NodeName, out traceNode)) traceNode.SetOverride( message.VarOverride.RootIndex, message.VarOverride.VarIndex, message.VarOverride.Value); } } if (message.Script != null) { if (!Options.HasFlag(MaintFaceOptions.EnableCodeInjection)) { Trace.WriteLine(nameof(MaintFace) + ": Code injection is disabled."); } else { TraceNode traceNode; if (_nodes.TryGetValue(message.Script.NodeName, out traceNode)) traceNode.SetScript(message.Script.Source); } } if (message.DumpSourceName != null) { TraceNode traceNode; if (_nodes.TryGetValue(message.DumpSourceName, out traceNode)) { ServerSourceMessage response = new ServerSourceMessage(); response.MessageId = message.MessageId; response.Source = traceNode.ScriptSource; var serializedResult = serializer.Serialize(response); var buffer = Encoding.UTF8.GetBytes(serializedResult); var segment = new ArraySegment<byte>(buffer); if (webSocketInfo.Socket.State != WebSocketState.Open) return; await webSocketInfo.SendAsync(segment); } } if (message.TrafficCommand != null) { if (message.TrafficCommand == "Pause") webSocketInfo.PausedFlowGraph = true; else if (message.TrafficCommand == "Continue") webSocketInfo.PausedFlowGraph = false; } } } catch (Exception ex) { Trace.WriteLine(nameof(MaintFace) + " Error: " + nameof(CommandListener) + ": " + ex.Message); // Avoid spinning too fast Thread.Sleep(500); } } } finally { Interlocked.Decrement(ref _connectedCount); } }